---
# System prepended metadata

title: 1101 LSA 期中上機考解答版

---

# 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
```