pleezaD
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights
    • Engagement control
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Versions and GitHub Sync Note Insights Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       owned this note    owned this note      
    Published Linked with GitHub
    Subscribed
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    Subscribe
    # NA_計算機網路管理互助筆記 [SA互助筆記](https://hackmd.io/0dIy9vLuSqydRT-dwSjQdA?both) ## 簡單板規、格式 * 本筆記原則上完全開放,不管有沒有修過NA都歡迎 * 寫的東西具名、不具名都可以(具名請多利用`[name=YourName]`) * 禁止人身攻擊、謾罵,然後宗教戰爭盡量不要。拜託QQ * 不要刪除別人寫的東西,這樣大家會很困擾,對內容有意見可以用`>`發表Quote或在意見區寫下寶貴的意見 * 大區塊(ex.基本操作整理)請使用h2,小區塊(ex.一些你應該要先安裝的東西)請使用h3,然後沒事不要使用Heading,請多利用Quote和List * 基本上沒有誰說了算,希望能採用共識決 * 顏文字有時會造成HackMD格式上的混亂,不禁止但使用時要注意一下 * [HackMD操作指引](https://hackmd.io/s/E1UakUq8) >基本板規撰寫(2019/04/22)[name=pleezaD(明亮)] ## Lab1 Wireguard, DHCP **架構:** ![](https://i.imgur.com/gNR7vo8.png) VirtualBox->YourVM setting->Network 可以選擇使用幾張網卡 設定好後在VM中`ifconfig -a`可以看到所有可用的網卡(包括未啟用) [How to emulate a network using VirtualBox](http://www.brianlinkletter.com/how-to-use-virtualbox-to-emulate-a-network/) **VPN:** 本次作業只需要在`Router`上設置VPN Client。 `/etc/wireguard/wg0.conf`: ``` [Interface] PrivateKey = <Output of privatekey file that contains your private key> Address = <Your interface address>/<netmask> [Peer] PublicKey = <Server Public key> Endpoint = <Server Public IP or hostname>:51820 AllowedIPs = <network which your packet allowed to send to> ``` 注意幾點: 1. `[Interface]:Address`只需要給IP address,不用加CIDR。 2. 在設定VPN時不需要管`wg0`的部分。Wireguard會自己維護這張網卡,加了rule反而容易會衝突。 3. 出現`RTNETLINK answers: File exists`錯誤時表示你的 routing table 有衝突。用`route -n`查看 routing table,`route del <routing entry>`手動刪除衝突的部分(通常是你設錯netmask造成)。 4. 記住 Private(接 Client)與 VPN (接 VPN 網路)的子網路遮罩(netmask)是不一樣的。 助教會給你的資訊: `Subnet`: DHCP的部分會用到 `Wireguard Private Key`: 你的VPN Client private key `Wireguard Peer IP`: 你`wg0`interface的IP(在`[Interface]:Address`設定),VPN網路中你就是這個IP `Wireguard Server`: Wireguard Server Hostname:Port `Wireguard Server Public Key`: Wireguard Server的public key,你會在`[Peer]:Endpoint:`中設定 `Wireguard Interal IP`: 不知道有什麼用 [Set Up WireGuard VPN on Ubuntu](https://www.linode.com/docs/networking/vpn/set-up-wireguard-vpn-on-ubuntu) **DHCP:** 1. 架好Network環境。 Router's Private interface 與 Client's interface 要在 VirtualBox 中設為內網(網路名稱要一樣)。注意進階→混合模式不要設成`拒絕`。 2. 進`/etc/default/isc-dhcp-server`設定 DHCP Server 要聽在哪幾張網卡上(可多選,用空白隔開)。 3. 進`etc/dhcp/dhcpd.conf`設定 DHCP Server 本身的參數。 4. `systemctl restart isc-dhcp-server` 6. 在 client 用`sudo dhclient <interface>`來手動 DHCP。或在`/etc/network/interfaces`設定,開機自動使用 DHCP。 * 可以在`/var/lib/dhcp/dhcpd.leases`中查詢存在的租約 [How to build Ubuntu Server in VirtualBox on host-only network adapter with internet access from host](https://medium.com/@exesse/how-to-build-ubuntu-server-in-virtualbox-on-host-only-network-adapter-with-internet-access-from-81cd7253e3b1) [How to Install and Configure DHCP on Ubuntu 18.04](https://linoxide.com/linux-how-to/install-configure-dhcp-ubuntu/) [Ubuntu 網路卡(`/etc/network/interfaces`)設定 | Calos's Blog](https://caloskao.org/ubuntu-nic-configure/) **VPN** 基本上都在用`iptables`這個工具。不熟的可以參考鳥哥的文章,非常清晰易懂。注意不要去替 `wireguard` 做 Forwarding ,很可能導致衝突讓你跑不出東西來。 話說`route`與`iptables`的設定上有什麼不同啊? > `route` 是 routing table;`iptables`是防火牆,沒辦法做routing,只能對某個路由做阻擋(不幫忙轉發) [Linux 的封包過濾軟體: iptables](http://linux.vbird.org/linux_server/0250simple_firewall.php#netfilter) [[Ubuntu 14.04 LTS] NAT Router](http://eric.logdown.com/posts/2014/12/29/ubuntu-1404-lts-nat-router?fbclid=IwAR1UOnowN-sK3V9be-vnWlzdQGrwNsqdyBxKRcZJryUWcWIvZ1_TN91yndw) ## Lab2 LDAP ### DHCP 這次要給LDAP Master一個固定位址,需要用到static dhcp。 在`/etc/dhcp/dhcpd.conf`中找到這段 > 這是我改完的畫面,預設是被註解掉 ![](https://i.imgur.com/VtWvcPu.png) * `Master`改為Client的hostname * `hardware ethernet`改為Client的MAC * `fixed-address`改為你要給他的固定IP 再restart server後應該就可以了 [ISC DHCP Server Static Lease](https://oitibs.com/isc-dhcp-server-static-lease/) ### LDAP :::info :mega:什麼都是假的,只有man page是真的。 ::: 搜尋時最好加上時間限制,看近幾年的文章。不然會因為一直找到舊版教學浪費時間。 看完這篇文章你就應該能成功架好LDAP Server [使用Ubuntu Server架設LDAP伺服器](https://magiclen.org/ubuntu-server-ldap/) [LDAP教學](http://dic.vbird.tw/linux_server/unit07.php) 要修改`/etc/hosts`加入`<server ip> ldap://ldap.<Base DN>` ex.`10.113.37.11 ldap://ldap.0516224.nasa` 或著直接用LDAP server IP也行,但兩種方式統一選一種用 ex. `10.113.37.11 ldap://10.113.37.11` ### 新增objectClass與Attribute: 需要新增`example.schema`檔案 請依照下面這份Specification寫好`.schema` [Schema Specification](http://www.openldap.org/doc/admin24/schema.html) * `numericoid`就我目前所知亂設沒關係 * 因為每個node只能有一個`STRUCTURAL objectClass`,所以建議自訂義的objectClass型態用`AUXILIARY`就好 範例: ```schema attributetype ( 2.2.3.1 NAME 'address' DESC 'IP address' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) objectclass ( 1.2.3.1 NAME 'clusterInfo' DESC 'cluster information' AUXILIARY MUST address ) attributetype ( 2.2.3.1 NAME 'sshPublicKey' DESC 'ssh public key' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) objectclass ( 1.2.3.1 NAME 'publicKeyLogin' DESC 'object for ssh login by publickey' AUXILIARY MUST sshPublicKey ) ``` 然後依照這篇把`*.schema`轉成`*.ldif` 1. 建立一個`example.conf`。 裡面只有一行`include /path/to/file/example.schema` 2. 創建一個資料夾`exampleDir` 3. 執行`slaptest -f example.conf -F exampleDir` 4. `exampleDir//cn=config/cn=schema`裡會出現一個`example.ldif` 把`.ldif`裡的`dn`改成`cn=example,cn=schema,cn=config`;檔名改成`cn`欄位的內容 改好大概長這樣: ![](https://i.imgur.com/uZrbh1l.png) 5. 將`slapd`關掉 6. `slapadd -l exmaple.ldif -n 0`將檔案加入資料庫(**要確認沒有Error!**) 7. 確認`example.ldif`有在`/etc/ldap/slapd.d/cn=config/cn=schema`底下就表示加入成功 :::warning :zap: **重要:** 要記得把`example.ldif`的owner與group改成`openldap`,否則slapd會開不起來 ::: 參考: [Creating a new ObjectClass and Attribute in openLDAP](https://stackoverflow.com/questions/45511696/creating-a-new-objectclass-and-attribute-in-openldap) ### 在BaseDN底下新增node 1. 請依教學[LDAP教學](http://dic.vbird.tw/linux_server/unit07.php)寫好`.ldif`檔案。 **每個node都要恰好有一個STRUCTURE的objectClass** 範例: ```ldap dn: cn=TA,dc=0516224,dc=nasa objectClass: organizationalRole objectClass: posixAccount objectClass: publicKeyLogin cn: TA uid: TAaccount gidNumber: 10000 homeDirectory: /home/ldapuser uidNumber: 3000 sshPublicKey: <public key> ``` 2. 加入node:`ldapadd -x -W -D "cn=admin,<your Base DN>" -f sample.ldif` ex.` ldapadd -x -W -D "cn=admin,dc=0516224,dc=nasa" -f add.ldif` 成功的畫面大概長這樣: ![](https://i.imgur.com/IGkQgDu.png) ### 讓機器以Ldap登入 1. 在你的BaseDN下新增一個ou(organization unit)叫People 2. 然後在下面新增使用者(group也要建) 詳細步驟請參考下列文章的`User and Group Management`章節: [Ubuntu Openldap指南](https://help.ubuntu.com/lts/serverguide/openldap-server.html.en#ldap-usergroup-management) 3. 在別台機器上設定ldap client使之可以用ldap登入 照著這篇文章做就行了 [How to Configure LDAP Client to Connect External Authentication](https://www.tecmint.com/configure-ldap-client-to-connect-external-authentication/) 要注意的是**有時**會因為顯示問題會讓你打的字錯位,所以如果沒有要用預設值記得`backspace`按到底再整個重打 ![](https://i.imgur.com/b67yLPA.png) ![](https://i.imgur.com/VBTQ2cy.png) **讓client可以使用`passwd`更改密碼** 依照這篇去修改`/etc/pam.d/common-password` [How to allow LDAP user to change password?](https://askubuntu.com/questions/340340/how-to-allow-ldap-user-to-change-password) ### slave server [How to configure OpenLDAP Master-Slave Replication](https://www.itzgeek.com/how-tos/linux/configure-openldap-master-slave-replication.html) [Centralized authentication using OpenLDAP](https://wiki.gentoo.org/wiki/Centralized_authentication_using_OpenLDAP#Replication) [askUbuntu: How to configure Master-Slave LDAP replication](https://askubuntu.com/questions/360190/how-to-configure-master-slave-ldap-replication) 1. 在master server創建一個指定的帳號 ```ldap dn: cn=Syncer,dc=your,dc=baseDN objectClass: simpleSecurityObject objectClass: organizationalRole cn: Syncer description: Replication User userPassword: {SSHA}C1Vj2CKdKERgFNpEL9lTf0UgObRXZuG8 ``` > userPassword使用`slappasswd -h {SSHA} -s "your password"`產生 > >不hash,直接用明碼似乎也行 > > 加入ldap: > ```bash > ldapmodify -H ldapi:/// -x -W -D "cn=admin,dc=your,dc=baseDN" -f filename.ldif > ``` 2. 在master server * 設定允許`cn=Syncer`讀取`userPassword` * `olcDbIndex`創建目錄,加速ldap server存取資料的速度 * 載入`syncprov`模組,讓slave可以同步 ```ldap dn: olcDatabase={1}mdb,cn=config changetype: modify delete: olcAccess olcAccess: {0}to attrs=userPassword by self write by anonymous auth by * none - olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by dn="cn=admin,dc=0516224,dc=nasa" write by dn="cn=Syncer,dc=0516224,dc=nasa" read by anonymous auth by * none - add: olcDbIndex olcDbIndex: entryUUID eq - add: olcDbIndex olcDbIndex: entryCSN eq - dn: cn=module{0},cn=config changetype: modify add: olcModuleLoad olcModuleLoad: {1}syncprov - dn: olcOverlay=syncprov,olcDatabase={1}mdb,cn=config changetype: add objectClass: olcOverlayConfig objectClass: olcSyncProvConfig olcOverlay: {0}syncprov olcSpCheckpoint: 100 10 olcSpSessionlog: 100 ``` :::warning :zap: 這邊要動到`config`,所以必須要以 `-D cn=config`身分來做`ldapmodify` 後面會講如何更新`cn=config`的密碼 ::: > 加入ldap: > ```sh > sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f filename.ldif > ``` 3. 在slave server * **你在master server加入的objectType、attributeType也都要加在slave server裡,上一部新增的`olcIndex`也要有。簡單來說就是兩者的設定盡量一致** * `olcSyncrepl`的參數定義可以參考[man slapd-config](https://manpages.courier-mta.org/htmlman5/slapd-config.5.html)。 比較重要的有: `binddn`:要用什麼身分去同步(作業要求用`cn=Syncer`) `credentials`:`binddn`的密碼 `interval`:slave去同步資料的間隔 * `olcSuffix`:指定query的後綴(可以有多個,通常是baseDN) * `olcRootDN`:定義有superuser權限的root的Distingush Name * `olcRootPW`:`RootDN`的密碼 ```ldap dn: cn=config changetype: modify replace: olcServerID olcServerID: 1 dn: olcDatabase={1}mdb,cn=config changetype: modify replace: olcSuffix olcSuffix: dc=0516224,dc=nasa - replace: olcRootDN olcRootDN: cn=admin,dc=0516224,dc=nasa - replace: olcRootPW olcRootPW: {SSHA}pQv7lj/3blpuf9QKhGiSvHoru8Y8kX8+ - add: olcSyncrepl olcSyncrepl: rid=001 provider=ldap://<master server ip> binddn="cn=admin,dc=0516224,dc=nasa" bindmethod=simple credentials="adminPasswd" searchbase="dc=0516224,dc=nasa" type=refreshOnly interval=00:00:01:00 timeout=10 network-timeout=10 retry="60 +" schemachecking=on dn: olcDatabase={1}mdb,cn=config changetype: modify add: olcMirrorMode olcMirrorMode: TRUE - add: olcDbIndex olcDbIndex: entryUUID eq - add: olcDbIndex olcDbIndex: entryCSN eq ``` > 加入ldap: > ```sh > sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f filename.ldif > ``` **修改`cn=config`密碼** ```ldap dn: olcDatabase={0}config,cn=config changetype: modify add: olcRootPW olcRootPW: newPassword ``` ```sh sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f <filename>.ldif ``` 參考:[Unknown LDAP cn=config admin password](https://serverfault.com/questions/556629/unknown-ldap-cn-config-admin-password) ### Access Control 1. * 需要在到`/etc/ldap/slapd.d/cn=config/<a olcDataBase>`設定`olcAccess` * 這次作業要求`cn=Syncer,dc=base,dc=DN`只能被slave server讀到 * 因為是設定在BaseDN下node,所以我們要調整 `olcDatabase={1}mdb.ldif` 2. 寫好`modiAcl.ldif` 範例: ```ldif dn: olcDatabase={1}mdb,cn=config changetype: modify add: olcAccess olcAccess: {2}to dn.exact="cn=Syncer,dc=0516224,dc=nasa" by peername.ip=10.113.37.12 read by * none ``` * `{2}`用於指定新加入的`olcAccess`是第幾順位 * 詳細的格式請參考:[Openldap: Access Control](http://www.openldap.org/doc/admin24/access-control.html) ## Lab3 DNS [Ubuntu Domain Name Service (DNS)](https://help.ubuntu.com/lts/serverguide/dns.html.en) [簡介 DNSSEC (Introduction to DNS Security Extensions)](https://www.lijyyh.com/2012/07/dnssec-introduction-to-dnssec.html) [SSHFP: Authenticate SSH Fingerprints via DNSSEC](https://blog.webernetz.net/sshfp-authenticate-ssh-fingerprints-via-dnssec/) **設定檔**: `/etc/bind/name.conf.local`:設定domain, zone, view etc. `/etc/bind/name.conf.options`:設定global參數(ex.`recursion`, `allow-query`, `forward`) [DNS BIND9 Query Statements(可用參數)](http://www.zytrax.com/books/dns/ch7/queries.html#allow-recursion) **ACL(Access Control List)** 通常寫在設定檔最頂端,一定要在使用前宣告。 格式: ``` acl <acl name> { domain1; domain2; ... ... }; ``` ### DNSSEC [NSEC/NSEC3 Resource Records Format](https://docs.infoblox.com/pages/viewpage.action?pageId=3246079) 1. 請先看上面的連結熟悉一下DNSSEC 2. 利用`dnssec-keygen`產生KSK, ZSK ```shell=on format: dnssec-keygen -r <random device> -f KSK -a <alogorithm> -b <byte> -n <nametype> <zone name> KSK: dnssec-keygen -r /dev/urandom -f KSK -a RSASHA256 -b 2048 -n ZONE <stu-id>.nasa ZSK: dnssec-keygen -r /dev/urandom -a RSASHA256 -b 1024 -n ZONE <stu-id>.nasa ``` 3. 將key引入你的zone file中。如果你的key有階層,請在最下面一層(引入其他zone file的zone file)操作。 ```scirpt $INCLUDE /etc/bind/keys/K<stuid>.nasa.+008+<key id>.key $INCLUDE /etc/bind/keys/K<stuid>.nasa.+008+<key id>.key ``` 4. 利用`dnssec-signzone`將zone file加入DNSSEC資訊 ```shell=on format: dnssec-signzone -o <zone name> -k <KSK_file> -d <dir storing dsset-> -g -3 <salt> <zone_file> <ZSK_file> dnssec-signzone -o 0516224.nasa. -k deskey/K0516224.nasa.+008+59749.key -d . -g -3 - db.0516224.nasa.any deskey/K0516224.nasa.+008+47943.key ``` `-3 -`表示不加salt。 5. 限制`cn=Syncer,dc=0516224,dc=nasa`只能給slave server存取 * `dn.exact`之類的意義請參考[man Access Control](http://www.openldap.org/doc/admin24/access-control.html) * 要注意olcAccess的優先序 * `{index}`只是用來表示順序,也可以當alias使用 ```ldap dn: olcDatabase={1}mdb,cn=config changetype: modify add: olcAccess olcAccess: to dn.exact="cn=Syncer,dc=0516224,dc=nasa" by peername.ip=<slave ip> read by * none ``` ## Lab4 Postfix :::danger :warning: 中文教學雷包一堆,少看為妙。 ::: :::danger :warning: 請注意此部分是晚一年的修課生寫的,spec內容不完全相同,照抄者風險自負 :warning: 另請注意本人做死使用的OS是mint,雖然是基於ubuntu開發的,但是還是有區別 :warning: 本廢物只有寫80分,關於dmarc dkim check policy跟spam detector完全沒動 ::: [ubuntu document: PreviousNext Postfix](https://help.ubuntu.com/lts/serverguide/postfix.html.en) [How to Set up SPF and DKIM with Postfix on Ubuntu Server](https://www.linuxbabe.com/mail-server/setting-up-dkim-and-spf) 本文下方使用的xed等同於ubuntu的gedit 1. 安裝postfix與其他必要套件 ```shell=on sudo apt install postfix postgrey opendmarc opendkim postfix-policyd-spf-python sudo apt install dovecot-imapd dovecot-core ``` postfix: 本次作業主角,所有寄信功能的處理 dovecot: 用於協助postfix進行使用者驗證 postgrey: 用於greylist新來的使用者 opendmarc: 用於 opendkim: 用公鑰/私鑰簽署寄出的信件,確保信件內容沒有被竄改 spf: 用於辨識寄信來源的IP是否是寄件者網域的合法MX 記得在router上打開到mx server的防火牆 2. DNS part: spf dmarc dkim mx record mx/spf record 解釋一下spf在幹嘛 ``` v spf version a DNS server裡面有紀錄的A record,前面的+號是指所有record mx DNS server裡面有紀錄的MX record,前面的+號是指所有record all 代表以上的紀錄 ``` all的地方比較複雜,單獨拉出來一塊 ```shell=on - 代表除了以上有紀錄的機器以外皆為非法的寄件者 ~ 代表以上的有紀錄的機器為合法的寄件者,但可能有其他的寄件者未記錄 ``` ```shell=on @ IN A 10.113.ID.IPAddrYouLike @ IN MX 0 mail @ IN TXT "v=spf1 +a +mx -all" @ IN SPF "v=spf1 +a +mx -all" mail IN TXT "v=spf1 +a +mx -all" mail IN SPF "v=spf1 +a +mx -all" mail IN A 10.113.13.IPAddrYouLike mail IN MX 0 mail ``` dmarc record ```shell=on _dmarc IN TXT "v=DMARC1;p=reject" ``` dkim record ``` -D 是要在哪邊生成key file -d 是domain name -s 是selector 這邊使用default 你也可以用你喜歡的selector 只是記得後面要記得全部換掉 ``` ```shell=on sudo mkdir /etc/opendkim/keys sudo opendkim-genkey -D /etc/opendkim/keys/ -d studentID.nasa -s default sudo chown -R opendkim: /etc/opendkim/keys ``` 以上都完成之後會有default.private跟default.txt 將default.txt的內容物全部丟進去zone file 以上內容全部完工之後重新簽署dnssec ### dkim還未完工,後面繼續講 3. postfix setup `sudo xed /etc/postfix/main.cf`打開postfix主要設定檔案 更改以下內容(自行去除大括號) ```shell=on myhostname = mail.{studentID}.nasa mydomain = {studentID}.nasa myorigin = $myhostname mynetworks = 127.0.0.0/8, 10.113.ID.0/24 mydestination = localhost$mydomain, localhost smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes smtpd_sasl_security_options = noanonymous ``` ### check config file `sudo postfix check` ### restart postfix `sudo systemctl restart postfix` 4. dovecot setup 這邊首先設定dovecot要支援的protocol 這邊是imap跟lmtp `sudo xed /etc/dovecot/dovecot.conf` ```shell=on # Enable installed protocols !include_try /usr/share/dovecot/protocols.d/*.protocol protocols = imap lmtp ``` 設定dovecot要listen的地方 ```shell=on listen = *, :: ``` 設定登入時自動在使用者名稱後面加上的domain(?) ```shell=on auth_default_realm = mail.{studentID}.nasa ``` 以下部分為optional 關於logging的部分 對於記錄從OJ來的log有幫助 ```shell=on log_path = /var/log/dovecot.log info_log_path = /var/log/dovecot-info.log debug_log_path = /var/log/dovecot-debug.log auth_verbose = yes auth_verbose_passwords = yes auth_debug = yes mail_debug = yes ``` `sudo xed /etc/dovecot/conf.d/10-auth.conf` 這邊要特別注意的是,dovecot跟postfix的設定檔案如果遇到相同的參數,後者會直接overwrite 例如我在第4行的地方輸入了`auth_mechanisms = plain login` 而後面又多打了 `auth_mechanisms = plain` 那麼最後套用的設定會是後者 ```shell=on disable_plaintext_auth = no auth_mechanisms = plain login ``` `sudo xed /etc/dovecot/conf.d/10-mail.conf` 這邊設定寄進來的信件的存放位置 根據conf的註解表示 ``` %u username %n user part in user@domain %d domain part in user@domain %h home directory ``` 你各位也可以選擇自己想放的位置 資料夾的權限懶得動腦的話就開給所有人都能寫入 ```shell=on mail_location = maildir:/var/mail/%d/%n ``` `sudo xed /etc/dovecot/conf.d/10-master.conf` ```shell=on unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix } ``` 5. STARTTLS 這邊首先生成self-signed certificate 可以自己決定certificate要放在哪邊 建議放在 /etc/ssl 或是 /etc/postfix 下面 ```shell=on sudo mkdir /etc/ssl/private chmod 700 /etc/ssl/private openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/studentID.key -out /etc/ssl/certs/studentID.crt ``` `sudo xed /etc/postfix/main.cf` ``` smtpd_use_tls = yes smtp_tls_mandatory_protocols = !SSLv2, !SSLv3 smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3 smtpd_tls_cert_file = /etc/ssl/certs/studentID.crt smtpd_tls_key_file = /etc/ssl/private/studentID.key ``` `sudo xed /etc/postfix/master.cf` ``` submission inet n - n - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level = encrypt -o smtpd_sender_restrictions = $submission_sender_checks ``` `sudo xed /etc/dovecot/conf.d/10-ssl.conf` ```shell=on ssl = yes ssl_cert = </etc/ssl/certs/studentID.crt ssl_key = </etc/ssl/private/studentID.key ssl_protocols = !SSLv2 !SSLv3 ``` 設定完成後可用以下指令進行測試 `openssl s_client -connect imap.example.com:25 -starttls smtp` `openssl s_client -connect imap.example.com:143 -starttls imap` 在smtp的console輸入ehlo {somedomain} 之後應該會看到 250 auth plain 6. DKIM 使用上面DNS record的key `sudo xed /etc/opendkim.conf` ``` Mode sv Canonicalization relaxed/simple Domain studentID.nasa Socket inet:8891@localhost Selector default KeyTable refile:/etc/opendkim/KeyTable SigningTable refile:/etc/opendkim/SigningTable ExternalIgnoreList refile:/etc/opendkim/TrustedHosts InternalHosts refile:/etc/opendkim/TrustedHosts On-BadSignature reject UnprotectedKey none ``` `sudo xed /etc/opendkim/KeyTable` 要用哪個key來簽署 請注意此處的default是上面提及的selector 如果不是使用這個 selector 的話請記得換掉 ``` default._domainkey.studentID.nasa studentID.nasa:default:/etc/opendkim/keys/default.private ``` `sudo xed /etc/opendkim/SigningTable` 哪個domain要簽 ``` *@studentID.nasa default._domainkey.studentID.nasa ``` `sudo xed /etc/opendkim/TrustedHosts` ``` localhost mail.studentID.nasa studentID.nasa ``` 將下列參數放進`main.cf` `sudo xed /etc/postfix/main.cf` ``` smtpd_milters = inet:127.0.0.1:8891 #opendkim的socket non_smtpd_milters = $smtpd_milters milter_default_action = accept ``` 7. opendmarc `sudo xed /opendmarc.conf` ``` AuthservID mail.studentID.nasa RejectFailures true Socket inet:8893@localhost TrustedAuthservIDs mail.studentID.nasa ``` 修改下列參數為`main.cf` ``` smtpd_milters = inet:127.0.0.1:8891, inet:127.0.0.1:8893 ``` 8. Greylisting `sudo xed /etc/default/postgrey` ``` POSTGREY_OPTS="--inet=127.0.0.1:10023 --delay=30" ```

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully