防火牆設定:

本步驟旨在於設定防火牆,以保護系統安全。

準備材料:已完成遠端連線設定之樹莓派、個人電腦(須連上網路)

以 SSH 連線登入樹莓派伺服器
輸入 sudo ufw status,應可以得到如下結果

sh
1
2
ubuntu@ubuntu:~$ sudo ufw status
Status: inactive

此提示則表示防火牆未開啓
此時輸入 sudo ufw allow <SSH連接埠號>,如下例所示

sh
1
2
3
ubuntu@ubuntu:~$ sudo ufw allow 8384
Rules updated
Rules updated (v6)

此結果表示防火牆規則已成功更新,並開啓 Port 8384 供 SSH 連線使用
另外輸入 sudo ufw allow 'Nginx FULL' 來將防火牆之 80、443 網頁伺服器端口打開
輸入 sudo ufw enable 開啓防火牆,提示可能造成 SSH 中斷時,輸入 y 繼續動作

sh
1
2
3
ubuntu@ubuntu:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

此時應可以看到提示說明防火牆已開啓,並在開機時自動啓動
(可選)可以輸入 sudo ufw status verbose 查看目前啓用之規則

詳細 ufw 操作方式請參考官方說明文件 https://help.ubuntu.com/community/UFW
另外也可以參考 DigitalOcean 的 How To Set Up a Firewall with UFW on Ubuntu 20.04 爲不錯的教學文件

系統帳戶認證

本步驟旨在於將 LDAP 整合 NSS 與 PAM,並給管理員帳戶 SUDO 權限

準備材料:已完成 LDAP 部署之樹莓派、個人電腦(須連上網路)

安裝 libnss-ldapd 和 libpam-ldapd

sh
1
sudo apt-get install libnss-ldap libpam-ldap

修改 NSS 設定檔

sh
1
sudo nano /etc/nsswitch.conf

內容如下

plaintext
1
2
3
passwd:         files systemd ldap
group: files systemd ldap
shadow: files ldap

安裝 nslcd

sh
1
sudo apt-get install nslcd

重新啟動系統
更改 PAM 設定

sh
1
sudo pam-auth-update

勾選 Create home directory on login 後選擇 OK 確認
安裝 sudo-ldap

sh
1
sudo su

此時應該可見提示字符變為 root 開頭

sh
1
2
3
# export SUDO_FORCE_REMOVE=yes
# apt-get install sudo-ldap
# export SUDO_FORCE_REMOVE=no

離開 root 模式

sh
1
# exit

新建資料夾以暫時存放 ldap 之 sudo 基模(schema),供後續編輯及導入

sh
1
mkdir ~/sudoWork

複製預設 sudo 基模至 LDAP 之基模庫中

sh
1
sudo cp /usr/share/doc/sudo-ldap/schema.OpenLDAP /etc/ldap/schema/sudo.schema

將匯入之基模轉為暫時設定檔

sh
1
sudo echo "include /etc/ldap/schema/sudo.schema" > ~/sudoWork/sudoSchema.conf

將設定檔轉為可匯入 LDAP 之 LDIF 檔

sh
1
slapcat -f ~/sudoWork/sudoSchema.conf -F /tmp/ -n0 -s "cn={0}sudo,cn=schema,cn=config" > ~/sudoWork/cn\=sudo.ldif

清理 LDIF

sh
1
nano ~/sudoWork/cn\=sudo.ldif

將文件開頭更改如下

ldif
1
2
3
dn: cn=sudo,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: sudo

將文件尾末如下內容去除

ldif
1
2
3
4
5
6
7
structuralObjectClass: olcSchemaConfig
entryUUID: 10dae0ea-0760-102d-80d3-f9366b7f7757
creatorsName: cn=config
createTimestamp: 20080826021140Z
entryCSN: 20080826021140.791425Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20080826021140Z

將此基模載入 LDAP 伺服器

sh
1
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f ~/sudoWork/cn\=sudo.ldif

增加 sudo 基模之索引

sh
1
sudo bash -c 'echo "index    sudoUser    eq" >> /etc/ldap.conf'

重啟 LDAP 伺服器

sh
1
sudo systemctl restart slapd

於 LAM 管理介面匯入如下內容

ldif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: 1

dn: ou=SUDOers,dc=iacms,dc=net
objectclass: organizationalUnit
objectclass: top
ou: SUDOers

dn: cn=sudo_role,ou=SUDOers,dc=iacms,dc=net
cn: sudo_role
objectclass: sudoRole
objectclass: top
sudocommand: ALL
sudohost: ALL
sudouser: iacms
  • 注意修改 dc 部分
  • sudouser 部分更改為先前添加之使用者,此處以 iacms 為例

修改 sudo-ldap.conf 設定,以連接 ldap 伺服器

sh
1
sudo nano /etc/sudo-ldap.conf

添加下面內容,並修改 dc 部分

plaintext
1
sudoers_base ou=SUDOers,dc=iacms,dc=net

修改 ssh 伺服器配置

sh
1
sudo nano /etc/ssh/sshd_config

於文件尾末添加如下內容

plaintext
1
2
Match   User    ubuntu
PasswordAuthentication no

將之前於遠端連線設定十修改之 PasswordAuthentication no 註解如下

plaintext
1
#PasswordAuthentication no

測試先前於 LDAP 建立之使用者應能夠使用 SSH 以密碼登入,並使用 sudo 指令

參考資料

SSL之設定

本步驟將使用 phpMyAdmin 管理 MySQL 資料庫,並導入必要之資料表。

準備材料:已完成建立 Reverse Proxy 之樹莓派伺服器、個人電腦(須連上網路)

安裝證書申請工具

sh
1
sudo apt install certbot python3-certbot-nginx

在 nginx 啓用的網頁設定檔中更改伺服器名稱,以下使用 ntuhort.ddns.net 之域名爲例,且設定檔路徑爲 /etc/nginx/sites-enabled/arduinoproject

sh
1
sudo nano /etc/nginx/sites-enabled/arduinoproject

找到該行並修改伺服器名稱爲

plaintext
1
2
3
...
server_name ntuhort.ddns.net;
...

測試設定檔是否正確

sh
1
sudo nginx -t

若無錯誤則重新載入 nginx 服務

sh
1
sudo systemctl reload nginx

允許 HTTPS 通過防火牆

sh
1
sudo ufw allow 'Nginx Full'

取得 SSL 憑證

sh
1
sudo certbot --nginx -d ntuhort.ddns.net

Fail2ban 安裝及設定

本步驟將利用 Fail2ban 防止惡意之帳戶暴力攻擊。

準備材料:已完成建立 Reverse Proxy 之樹莓派伺服器、個人電腦(須連上網路)

以 SSH 登入伺服器,並更新套件庫
安裝 Fail2ban

console
1
sudo apt install fail2ban

查看 Fail2ban 狀態

console
1
sudo systemctl status fail2ban

新增本地設定檔

console
1
sudo nano /etc/fail2ban/fail2ban.local

內容如下

plaintext
1
2
3
[DEFAULT]
loglevel = INFO
logtarget = /var/log/fail2ban.log

新增本地監獄規則

console
1
$ sudo nano /etc/fail2ban/jail.local

內容如下

plaintext
1
2
3
4
5
6
[DEFAULT]
bantime = 1800
findtime = 600
maxretry = 3
backend = systemd
ignoreip = 127.0.0.1/8

詳細用法參考官方說明文件,參考資料有