# 1101 LSA 期中上機考解答版 期中上機考解答版,不包含 Web Server ## A. 檔案權限設定 4% ### 1. 請在家目錄底下建一個檔案名稱為 `1101LSA_學號`,並依照以下條件設定存取權限 (2%) - 擁有者可以 「 讀、寫、執行 」 - 跟擁有者同一群組的可以 「 讀、執行 」 - 其他人只能 「執行 」 - 無論任何人在執行當下都會自動被變身為「此檔案擁有者」的身份和權限 ### 解答 1. 建立檔案名稱為 `1101LSA_學號` ```shell= vim 1101LSA_學號 ``` 2. 設定檔案權限 ```shell= chmod 4751 1101LSA_學號 ``` ### 2. 檔案**執行**時會顯示以下內容: (2%) ```txt= 你的名字 : 你的學號 : ``` ### 解答 1. 檔案內容 ```shell= echo "你的名字 :" echo "你的學號 :" ``` 2. 測試執行 ```shell= ./1101LSA_學號 ``` ## B. Forward Agent 4% 開啟並設定 Forward Agent 功能,使私鑰在 firewall 上進行轉送,不需要透過帳號密碼才能連進 internal zone 和 DMZ ![](https://hackmd.io/_uploads/H1Zj38_9F.jpg) ### 解答 1. 到==本地端==主機的 /etc/ssh 底下,將 ssh_config 檔案裡 ForwardAgent 設為 `yes` - 預設是 `no` 3. 到==遠端端==主機的 /etc/ssh 底下,確認 sshd_config 檔案裡 AllowAgentForwarding 為 `yes` - 預設是 `yes` 4. 將金鑰加入 authentication agent - 若私鑰檔名為 default key 時,則不須接私鑰路徑 ```shell= ssh-add <私鑰路徑> ``` ## C. iptables 20% MOLi 大學的阿明近期想針對學校資安部分做加強 想要先幫學生們過濾封包抵擋攻擊 並保護防火牆,只留需要的功能其餘皆不准進來 便委託小美幫忙架設, 阿明針對防火牆要夠酷提了幾點要求: :::danger 題目沒講的不能做到 EX: internal zone 不能 ping DMZ 的設備 ::: ![](https://i.imgur.com/QnQlN4C.png) 1. internal zone 的所有要去外網的封包會經由 firewall 送出去 (3%) 2. 在 firewall 開 port 80 (public network) 導向 DMZ 中的 web-server 的 80 port,並且 web-server 要能夠知道使用者的 IP (3%) 3. DMZ 可以透過 firewall 向 lsa.kija.io 建立 http 連線 (3%) 4. 准許外網 ssh 連線至 firewall (3%) 5. internal zone 中的 student 可以透過 private IP ssh 連線至 DMZ 中的 web-server,並且 web-server 要能夠知道使用者的 IP (3%) 6. 所有對外的 DNS request 皆會被 firewall 導向 1.1.1.1 (3%) 7. (WARRING) INPUT, FORWARD chain 預設的 policy 為 DROP (2%) 只要不符合以上要求,就是個不夠酷的防火牆 各位小美們,請幫忙小明實作個防火牆 :::info 檢驗方式(可能不只用以下方式檢驗) 通用:看 iptables 的規則 1 會也只會透過 firewall 向外網發出封包(ex: ping 8.8.8.8) 2 在學校開起瀏覽器,打上 firewall 的 ip 可成功顯示網頁 4 從學校網路任意電腦可 ssh 至 firewall 5 看相關設定 6 tcpdump en5 外網 en6 internal en7 dmz ::: ### 解答 1. internal zone 的所有要去外網的封包會經由 firewall 送出去 (3%) ```shell= sudo iptables -A FORWARD -i en6 -o en5 -j ACCEPT sudo iptables -A FORWARD -m conntrack --ctstate "ESTABLISHED,RELATED" -j ACCEPT sudo iptables -t nat -A POSTROUTING -o en5 -j MASQUERADE ``` 2. 在 firewall 開 port 80 (public network) 導向 DMZ 中的 web-server 的 80 port,並且 web-server 要能夠知道使用者的 IP (3%) ```shell= sudo iptables -t nat -A PREROUTING -i en5 -p tcp --dport 80 -j DNAT --to {web server ip}:80 sudo iptables -A FORWARD -i en5 -o en7 -j ACCEPT sudo iptables -A FORWARD -m conntrack --ctstate "ESTABLISHED,RELATED" -j ACCEPT ``` 3. DMZ 可以透過 firewall 向 lsa.kija.io 建立 http 連線 (3%) ```shell= sudo iptables -A FORWARD -i en7 -o en5 -d 159.223.32.147 -p tcp --dport 80 -j ACCEPT sudo iptables -A FORWARD -m conntrack --ctstate "ESTABLISHED,RELATED" -j ACCEPT sudo iptables -t nat -A POSTROUTING -o en5 -j MASQUERADE ``` 4. 准許外網 ssh 連線至 firewall (3%) ```shell= sudo iptables -A INPUT -i en5 -p tcp --dport 22 -j ACCEPT ``` 5. internal zone 中的 student 可以透過 private IP ssh 連線至 DMZ 中的 web-server,並且 web-server 要能夠知道使用者的 IP (3%) ```shell= sudo iptables -A FORWARD -i en6 -s {student ip} -d {web server ip} -o en7 -p tcp --dport 22 -j ACCEPT sudo iptables -A FORWARD -m conntrack --ctstate "ESTABLISHED,RELATED" -j ACCEPT ``` 6. 所有對外的 DNS request 皆會被 firewall 導向 1.1.1.1 (3%) ```shell= sudo iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to 1.1.1.1:53 sudo iptables -t nat -A PREROUTING -p tcp --dport 53 -j DNAT --to 1.1.1.1:53 ``` 7. (WARRING) INPUT, FORWARD chain 預設的 policy 為 DROP (2%) ```shell= sudo iptables -A INPUT -m conntrack --ctstate "ESTABLISHED,RELATED" -j ACCEPT sudo iptables -A INPUT -j DROP sudo iptables -A FORWARD -j DROP or sudo iptables -A INPUT -m conntrack --ctstate "ESTABLISHED,RELATED" -j ACCEPT sudo iptables -P INPUT DROP sudo iptables -P FORWARD DROP ``` ## D. Web Server 28% (可以分次 DEMO) ==**不提供解答,請自行實作**== ![](https://hackmd.io/_uploads/r1yy5KOcK.png) --- :::danger 由於 web server 需架在 DMZ 上,DMZ 需要完成 iptables 的第四條指令才能連進 web server </br> 如果不知道如何設定 iptables 第三、四題的指令,可以跟助教索取答案,但總分會扣 8 分 ::: **以下 service 需架在 DMZ 中的 web server 上** - 使用 nginx 設定以下 domain name 使他們連到對應的網頁 - `s<學號>-lb.1101.lsa` - `:80` : load balance - `s<學號>-proxy.1101.lsa` - `:80` : proxy 到 `lsa.kija.io` - `s<學號>-apache.1101.lsa` - `:8091` : 老師的各項資訊 - `s<學號>-lighttpd.1101.lsa` - `:8092` : 助教們的中文姓名 - `:8092/~<username>` : 課程資訊 - **apache** (8091) - 連線 8091 port,會顯示老師的各項資訊 ```htmlmixed= <head> <meta charset='UTF-8'> <h1>LSA 的老師</h1> <h2>中文名字:(請作答)</h2> <h2>英文全名:(請作答)</h2> <h2>常用 ID:(請作答)</h2> </head> ``` :::info **配分標準 (7%)** - 連線成功且網頁顯示無誤 (7%) - 連線成功但網頁顯示有誤 (4%) - 連線失敗 (0%) ::: - **lighttpd** (8092) - 連線 8092 port,會顯示 5 位正職助教的名字 ```htmlmixed= <head> <meta charset='UTF-8'> <h1>助教們的中文名字</h1> <h2>(請在此處填寫 5 位正職助教的名字(有在台上出現過的))</h2> </head> ``` - 在網址後加入 `/~<username>`,顯示課程資訊 > `<username>` 是 `s<你的學號>` ```txt= 本課程的 中文名稱: {請填寫內容} 英文名稱: {請填寫內容} 英文縮寫: {請填寫內容} ``` :::info **配分標準 (7%)** - 連線成功且網頁顯示無誤 (7%) - 連線成功但網頁顯示有誤 (4%) - 連線失敗 (0%) ::: - **nginx** (80) - 連線 80 port,load balance 到以下網頁 - `apache` 老師的各項資訊 - `lighttpd` 助教們的中文姓名 - proxy 到 `lsa.kija.io` :::info **配分標準 (7%)** - 連線成功且網頁顯示無誤 (7%) - 連線成功但網頁顯示有誤 (4%) - 連線失敗 (0%) ::: ## E. [加分題] 火車快飛 5% 做不出來夠酷的防火牆,至少做個有點酷的火車吧 - 在 firewall 主機新建一個使用者 `train`,登入此使用者之後會**直接**自動執行印出火車的指令,執行結束後,就直接登出 ### 解答 1. 安裝 sl ```shell= sudo apt install sl ``` 2. 新增使用者 train ```shell= sudo adduser train ``` 3. 找出 sl 指令的位置 ```shell= whereis sl ``` 4. 編輯 /etc/passwd ,更改使用者登入後使用的 script ( 將後面 /bin/bash 改成 /games/sl ) ```shell= sudo vim /etc/passwd ``` ```shell= train:x:1005:1005:,,,:/home/train:/usr/games/sl ``` 5. 就可以測試啦! ```shell= sudo su - train ```