# 1141 LSA-I 期中檢討 - 上機題(78 分) 這三台機器分別是: - Firewall 同時身兼 Gateway、Router - 對外網路(能夠一路通到 internet) - DMZ 網路(對外提供服務的伺服器會放在這裡) - 這個網段裡包含了 192.168.29.135/28 這個 IP - Firewall 的網卡用的是這個網段的「最後一個可用 IP」 - LAN 公司內網(員工的電腦 PC 在這裡) - 包含 PC 用的 172.21.21.121 - Server 網段裡包含了 192.168.29.135/28 這個 IP - Server 的網卡用的是這個網段的「第一個可用 IP」 - PC 的 IP 172.21.21.121 ![LSA 1141 - midterm - infra.drawio](https://hackmd.io/_uploads/SkT6aG3gZg.png) :::warning Firewall 上:對 DMZ 和 LAN 的網卡預設設定是錯的 ::: ## 一、基礎建設與網路連通 (Infrastructure & Network)(9 分) 1. 請將 Firewall 的網卡設定好,讓 Firewall 主機能 ping 到外網、server、pc ### 對外的網卡 DHCP 分配,不用額外寫 ### 對 DMZ 的網卡: 因為網段裡包含了 192.168.29.135/28 可以得知此段的網路位址為 192.168.29.128 - 第一個可用為 192.168.29.129 - 最後一個可用為 192.168.29.142 :::success 算法:\ `192.168.29.135`\ 換成二禁制\ `11000000 10101000 00011101 10000111`\ 跟遮罩 (/28) 做 AND\ `11111111 11111111 11111111 11110000`\ 得到網路位址\ `11000000 10101000 00011101 10000000`\ 換成十進位為\ `192.168.29.128` ::: 所以題目說 FW 裡對 server 1 (DMZ) 的那張網卡的描述是,該網段最後一個可用的 ip,因此要再設定檔裡設定 192.168.29.142/28 同時題目也有說 server 1 (DMZ) 的 ip 為此網段第一個可用 ip,在網卡設定完後要連 ssh 的話要連 192.168.29.129 這個 ip ### 對 LAN 的網卡 題目已經給了 pc 1 說明該往段內包含了 500 多個 ip 可以先用直覺想 /24 有 254 個可用 ip,所以遮罩退一位,可用 ip 數量就會加倍 (500多個),因此可以得知遮罩是 /23 :::success 算法:\ `172.21.21.121`\ 轉成二進制\ `10101100 00010101 00010101 01111001`\ 跟遮罩 (/28) 做 AND\ `11111111 11111111 11111110 00000000`\ 得到網路位址\ `10101100 00010101 00010100 00000000`\ 換成十進位為\ `172.21.20.0` ::: 可以得知此段的網路位址為 172.21.20.0 - 第一個可用為 172.21.20.1 - 最後一個可用為 172.21.21.255 所以題目說 FW 裡對 PC 1 的那張網卡的描述是,該網段的第一個可用 ip,因此要再設定檔裡設定 172.21.20.1/23 設定完再用 ssh 連題目給的 172.21.21.121 --- ``` network: version: 2 renderer: networkd ethernets: enp0s3: dhcp4: true enp0s8: addresses: - 192.168.29.142/28 enp0s9: addresses: - 172.21.20.1/23 ``` 2. 請將三台主機的名稱設定完成(3 分) :::success - `sudo hostnamectl set-hostname {new-server-name}` - `hostname` 會印出當前的 hostname - 到 /etc/hosts 裡,把 127.0.1.1 把後面改成新的 hostname ::: 3. 能夠成功從 Firewall ssh 連上 server、pc(2 分) :::warning ![](https://hackmd.io/_uploads/B1EerP0ba.png) ::: :::success `ssh-keygen -f "/home/{username}/.ssh/known_hosts" -R "192.168.29.129"` ::: ## 二、SSH(10 分) 1. 每次 ssh 時都要輸入密碼太麻煩了。請設定成 Firewall ssh 到 server 時不需要輸入密碼登入(讓 ssh 能用其他方式自動驗證)(2 分) :::success 設定金鑰登入 ::: 2. 每次 ssh 時都要打帳號、ip 等等太麻煩了。請設定預設使用者家目錄中的某個設定檔,讓預設使用者從 Firewall ssh 到 server 時只要輸入 `ssh srv` 就能自動帶入使用者名稱、位置等,正確成功連線到 server 裡(包含自動登入)。(2 分) :::success 編輯 `~/.ssh/config` ```conf= # ~/.ssh/config Host srv User {username} HostName 192.168.29.129 Port 22 ``` ::: 3. 修改 server 的 ssh service 設定,不允許使用者用密碼登入。(2 分) :::success - `/etc/ssh/sshd_config` - `PasswordAuthentication no` ::: 4. server 無法連到 pc,但是 server 能 ssh 連到 firewall 、 firewall 可以連到 pc,而且你有 Firewall 的帳密。請試著建立神秘的通道在 server 的 port 22222,讓連到 server port 22222 時會通到 pc 的 port 22。(4 分) :::success - 在 server 上執行 `ssh -L 22222:172.21.21.121:22 {username}@192.168.29.142` - 開另一個 terminal `ssh -p 22222 {username}@localhost` ::: ## 三、帳號設定與檔案操作(10 分) 1. 在 pc 上新增使用者 lsa 與 fasshy(1 分) - lsa 並且加入具有 sudo 權限的群組,讓 lsa 這個使用者也有 sudo 權限。 :::success - `sudo useradd lsa` - `sudo usermod -aG sudo lsa` - `groups lsa` ::: 2. 在 pc 上建立一個目錄 /opt/project/ 1. 這個目錄的權限(依照最小權限原則)(3 分) - 只有預設使用者以及 root 權限的人可以讀、寫、執行 - 預設使用者、lsa、fasshy 三人都在的群組成員可以讀、執行 :::success - 建立群組,加三個人進去 - `chown $USER:projectgrp /opt/project` - `sudo chmod 750 /opt/project` ::: 2. 這個目錄下有個檔案 data.txt(3 分) - 第一行內容是:系統紀錄檔 syslog 檔案的第一行 - 第二部份內容是:根目錄底下所有(且只有) s 開頭的資料夾名稱 - 須完全使用指令操作產生,而不是用編輯器編輯內容 :::success - `sudo head -n 1 /var/log/syslog > data.txt` - `ls -d /s* >> data.txt` ::: 3. 在這個目錄裡建立一個 hard link `data_hard` 到 data.txt,以及一個 soft link (symbolic link, symlink) `data_soft` 到 data.txt(1 分) :::success - `sudo ln /opt/project/data.txt /opt/project/data_hard` - `sudo ln -s /opt/project/data.txt /opt/project/data_soft` ::: 3. 將 data.txt 用 sftp 傳到 Firewall 上預設使用者家目錄中的 ~/project/ 裡(1 分) :::success - `sftp {username}@192.168.29.142` - `cd project` - `put /opt/project/data.txt` ::: 4. 在 Firewall 上用 scp 將這個 data.txt 傳到 server 的 /var/www/html 裡(1 分) :::success `scp ~/project/data.txt serveruser@192.168.29.129:/var/www/html/` ::: ## 四、DMZ Security Architecture(10 分) 請在「最小存取權限」原則下作答。 提示:(隱形通道)當說「不能連線」時,意思是「不能主動連線」,但允許 ESTABLISHED 與 RELATED 等封包回傳(Stateful inspection)。 1. Firewall 可以連到 DMZ 與 LAN 的任何地方 :::success 先到 firewall (NAT 主機) 裡面,開啟 Linux 轉發封包的功能 ``` sudo vim /etc/sysctl.conf #net.ipv4.ip_forward=1 <--解開這行 載入設定 sudo sysctl -p ``` 在 nat POSTROUTING chain 上面加 ``` sudo iptables -t nat -I POSTROUTING -o enp0s3 -j MASQUERADE ``` ::: 2. 外網 - 如果連到 Firewall 的 port 80 ,會自動被轉送到 server 的 port 80 - 不能直接連線 LAN :::success 允許外網經由 DNAT 進來,轉到 DMZ 的 server:80\ `iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 80 -j DNAT --to-destination 192.168.29.129:80` ::: 3. DMZ - 可以 ping (icmp) 到外網任何地方 - 可以連到外網的 8.8.8.8 dns、163.22.17.70 (ftp.ubuntu-tw.org) http - 不能連外網其他地方 - 不能直接連線 LAN :::success DMZ 可以 ping 外網\ `iptables -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.29.129 -p icmp --icmp-type echo-request -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT` DMZ → 8.8.8.8 DNS (UDP/TCP 53)\ `iptables -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.29.129 -d 8.8.8.8 -p udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT`\ `iptables -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.29.129 -d 8.8.8.8 -p tcp --dport 53 -m conntrack --ctstate NEW -j ACCEPT` DMZ → 163.22.17.70 HTTP (80)\ `iptables -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.29.129 -d 163.22.17.70 -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT` DMZ → LAN:完全禁止\ `iptables -A FORWARD -i enp0s8 -o enp0s9 -s 192.168.29.129 -d 172.21.21.121 -j DROP` ::: 4. LAN - 可以直接連線外網 - 可以直接連線 DMZ 的 ssh、收送 email、http、https :::success LAN → 外網:全部放行\ `iptables -A FORWARD -i enp0s9 -o enp0s8 -s 172.21.21.121 -m conntrack --ctstate NEW -j ACCEPT` `iptables -A FORWARD -i enp0s9 -o enp0s3 -s 172.21.21.121 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT` LAN → DMZ:只允許 SSH、HTTP、HTTPS、各種 mail 相關 port\ `iptables -A FORWARD -i enp0s9 -o enp0s8 -s 172.21.21.121 -d 192.168.29.129 -p tcp -m multiport --dports 22,80,443,25,465,587,110,995,143,993 -m conntrack --ctstate NEW -j ACCEPT` ::: ## 五、系統設定與除錯(8 分) 1. server 上執行 apt update 無法運作,因為連不上 tw.archive.ubuntu.com,該怎麼改軟體套件來源?(2 分) - 須改成 ftp.ubuntu-tw.org - 建議:請確保你使用防火牆允許的來源進行軟體列表更新。 :::success - 修改 `/etc/apt/sources.list` - 把 `tw.archive.ubuntu.com` 換成 `ftp.ubuntu-tw.org/ubuntu/` iptables(允許 DMZ → ftp.ubuntu-tw.org http)\ `iptables -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.29.129 -d 163.22.17.70 -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT` iptables(允許 DMZ → DNS 8.8.8.8)\ `iptables -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.29.129 -d 8.8.8.8 -p udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT` `iptables -A FORWARD -i enp0s8 -o enp0s3 -s 192.168.29.129 -d 8.8.8.8 -p tcp --dport 53 -m conntrack --ctstate NEW -j ACCEPT` ::: 2. server `ping google.com` 失敗,請找到原因並修正。(3 分) :::success /etc/hosts 被加了錯誤的 google.com 、 /etc/resolv.conf 的 server 被註解掉、/etc/nsswitch 被註解掉,修正就好了 ::: 3. 通常 ping 一個不存在的主機時,會失敗。請設定成在 firewall 上 `ping moli` 時,系統會因為找不到 `moli` 這台主機的 IP,所以自動在後面加上 `.lsa.tw` 變成 `moli.lsa.tw` ,然後順利 ping 到。(2 分) - 提示:請透過「系統的正式設定方式 netplan」設定搜尋 domain,而不是手動覆寫 /etc/resolv.conf :::success 編輯 Firewall 的 netplan 設定 ``` #/etc/netplan/*.yaml network: version: 2 ethernets: eth0: dhcp4: true nameservers: addresses: [8.8.8.8] search: [lsa.tw] ``` `sudo netplan try` ::: 4. 新增紀錄在 firewall 的某個設定檔,讓 firewall 要連線 server 時, `curl server.lsa.tw` 和 `ping lb.lsa.tw` 都能連到 server。(1 分) :::success 編輯 `/etc/hosts` ``` 192.168.29.129 server.lsa.tw lb.lsa.tw ``` ::: ## 六、服務架設 ### A: mail server(6 分) - 在 server 上裝 postfix 提供 @s學號.lsa.tw 網域的電子郵件服務(3 分) - `sudo apt install postfix` - Postfix configuration type:選 Internet Site - System mail name:輸入 s學號.lsa.tw - `telnet localhost 25` - 如果看到 220 mail.s學號.lsa.tw ESMTP Postfix 就 ok - 請設定 server 上的 alias 讓寄給 root 的信都會自動轉寄到預設使用者的信箱(1 分) - `sudo nano /etc/aliases` - `root: {username}` - sudo newaliases - sudo systemctl reload postfix - 請在 firewall 上使用 `telnet` 連到 server 的郵件服務,寄信給 server 上的 root(2 分) - `telnet 192.168.29.129 25` - `HELO firewall.s學號.lsa.tw` ### B: Docker(6 分) 使用 docker + docker-compose.yaml 建立多個服務 - 在 server 上的預設使用者家目錄中建立 docker/ 資料夾(3 分) - 裡面建立 docker-compose.yaml - 裡面建立兩個目錄 `nginx1` `nginx2`,分別各建立一個 index.html 且內容不同。 - 在 server 上使用 docker compose 同時啟動這兩個 nginx(1 分) - 這兩個 nginx 分別於對應到 server 的 port 8080 、8081(2 分) - port 8080 的提供 nginx1 裡的內容,port 8081 的提供nginx2 裡的內容 - 提示:掛載本機目錄進去容器中 ### C: nginx(4 分) - 在 server 上裝 nginx - 在不修改原始預設檔案內容的狀況下,新增一個 name-based virtual host `server.lsa.tw`,這個 virtual host 提供的內容都位在 /var/www/vhost/server.lsa.tw/。(2 分) - 設定檔須放置在該放的地方、用適當的方式啟用 - /var/www/vhost/server.lsa.tw/ 目錄裡有一個 index.html ,內容須包含你的學號,其他自由發揮 - 驗證:如果用其他名稱連上這個服務,維持顯示 nginx 預設畫面 - 在 server 上的 nginx 再多建立一個 name-based virtual host `lb.lsa.tw` - nginx 會 load balance 到兩個 docker nginx(2 分) - 驗證:在 firewall 可以連 server.lsa.tw 和 lb.lsa.tw 並有相對應的結果 :::spoiler 在 server - curl -H "Host: server.lsa.tw" http://localhost:{port} - curl -H "Host: asdf" http://localhost:{port} --- - 在 firewall 可以 curl lb.lsa.tw 並有相對應的結果 ::: ## 七、最終驗證與安全要求(10 分,必做!) 1. 從 Firewall 外部網路(你的筆電或直接用 curl localhost)連 http://fw-s[學號]:80 必須看到 server 上 nginx 的預設或 virtual host 頁面 (3 分) (提示:需要 iptables -t nat -A PREROUTING ... + FORWARD 規則 + MASQUERADE) 2. server 與 pc 必須能上網(server 要能 apt update)(2 分) 3. 從 pc 不能直接 ssh server(會 timeout 或 reject)(2 分) 4. lb.lsa.tw 必須能 load balance 到兩個 docker nginx(從 firewall curl 驗證)(3 分) ## 加分題 ### Samba(5 分) 1. 在 server 架設 samba 把 /opt/project 分享出去,匿名使用者可讀,預設使用者可寫(2 分) :::spoiler 學生 Windows 可看不可寫 在 server 中可以寫入檔案 ::: 2. 利用 iptables 技巧,讓你的筆電輸入掛載 firewall ip 時,會掛載到 server 上的 samba(3 分) :::spoiler 學生 Windows 可看不可寫 在 server 中可以寫入檔案 :::