@ ssh, sftp
通常安裝好 CentOS6_x64 作業系統後,sshd, ssh daemon 的服務功能是預設開啟的,如筆者的前面篇章所述,預設的 iptables 防火牆設定,亦是開啟讓 ssh 的連線是可通過的,不僅可以連出,也可以被連入。若要確認是否有安裝 sshd 套件以及在啟動時的 runlevel 2 3 5 是否有被載入,可以使用以下指令搜尋:
Protocol 2
/* 此部分維持預設,僅利用較安全的 sshd 2 版協定連線,連出主機端亦對應輸入 ssh -2 */
若要調整登入提示等待時間,以增強安全性效果,約 41行附近有一個
LoginGraceTime 2m
可修改為
LoginGraceTime 1m
主要將連線登入提示輸入帳號與密碼時間,縮短至 1 分鐘。
再接著有關帳號安全性問題
PermitRootLogin yes
預設為可允許 root 遠端登入,雖然對管理者很方便,但對入侵系統的人,也很方便。故請改為 no,並多加上一參數 AllowUsers ,可指定只有那些帳號可用遠端 ssh 登入,如以下:
PermitRootLogin no # 禁止直接用 root 登入,防止惡意人士用 root 試密碼登入
AllowUsers newuser # 很常用的重要設定
或設定僅允許哪些 group,藉以縮小可使用範圍,可輸入以下
AllowGroups misgroup
若要防止機器人程式不斷嘗試錯誤,來試圖非法登入,可更改以下參數
MaxAuthTries 6
更改改為
MaxAuthTries 3
讓登入只能嘗試 3 次錯誤就踢掉程序,重新登入,以防暴力法方式來試帳號與密碼。
MaxSessions 10
也可以設定為每個來源連線IP,能同時開啟 sessions 的最大次數,可改少,亦可維持預設。
若要使用無密碼登入,請開啟 49-50 行附近的
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
/* 此為提供 sshd 服務端的公鑰檔案名稱,搭配無密碼ssh登入 */
無密碼登入方式,可先在自己的家目錄下 cd ~ ,利用指令 ssh-keygen -t rsa -b 2048 來產生長度 2048bits 的 RSA演算法成對金鑰檔 (或在較新版本的 openssh 內, ssh-keygen -t ecdsa -b 256 產生長度 256bits 的 ECC DSA演算法的成對金鑰檔 ,如圖4-5,這裡有篇 RSA 與 ECDSA 之比較,https://koclab.cs.ucsb.edu/teaching/ecc/project/2015Projects/Levy.pdf ),並設定檔案位置為 ~/.ssh/id_rsa,此時 ssh-keygen 會建立身分檔 ~/.ssh/id_rsa 與一個公鑰(public key) ~/.ssh/rd_rsa.pub, 進入產生畫面後,皆輸入鍵盤Enter鍵即可。接著再利用 scp 將公鑰複製到提供 sshd 連線的遠端電腦主機,並將公鑰名稱改為 ~/.ssh/authorized_key( sshd_config 內預設為主 ),若遠端主機內無 .ssh 資料夾,請利用 ssh 192.168.100.200 'mkdir ~/.ssh' 新增。接著利用指令如下
$ scp ~/.sshid_rsa.pub 192.168.100.200:~/.ssh/authorized_key
或
$ scp ~/.sshid_ecdsa.pub 192.168.100.200:~/.ssh/authorized_key
為了安全性,請將 .ssh 資料夾設定成僅擁有的使用者可讀寫,如 chmod 600 ~/.ssh 。故提供連線的遠端電腦主機,帳號家目錄下 ~/.ssh/ 一定要包含連出端電腦主機產生的 ~/.ssh/id_*.pub 的公鑰資訊,與身分檔 ~/.ssh/id_* 成對。如圖4-5為利用 ecdsa 演算法產生公鑰
(圖4-5)
若公開金鑰配對有成功後,會如圖4-6,筆者利用無密碼ssh,直接利用金鑰登入真實的遠端主機,此方式在內部網路的叢集式電腦管理,相當實用。例如,可以直接 ssh 192.168.100.200 ! ls -al (符號 ! 一般指執行遠端主機的命令 ),直接對著 192.168.100.200 下指令,再搭配 shell script ,是不是就可以同時對著好幾台主機操作與管理呢?除此之外,若再搭配上 NFS 的網路硬碟系統,將發送端主機的磁碟給接收端主機們掛載,是不是就能利用這些接收端主機的計算資源,來幫忙處理發送端主機,需要較多計算資源的工作?聰明的讀者,可以用心想想,這可以有哪些好功用可以讓多主機管理或操作更方便。
(圖4-6)
緊接著,若要使用遠端主機 X11 之 X Windows ,請在約 110行 附近設定,如下
X11Forwarding yes # 預設為開啟
若想在低速網路環境中傳輸較大的封包,可利用約 119 行的 Compression 參數值,在連出的主機端,亦可搭配 ssh -C (但 man ssh 說明中,僅適合低速網路環境使用,如modem,在較高速的網路環境,反而會降低速度) 來連線。 修改 Compression 參數值如下:
Compression delayed
改為
Compression yes
若需使用 X Windows 連線至遠端工作的機器,再連出端可以利用指令 ssh -Y 192.168.100.200
( 參數 -Y 為直接允許 forwarding, 或是 ssh -X ),連線過去後,就可以執行 X Windows 的程式,如 /usr/bin/gnome-terminal & ( 使用符號 & 為將gnome-terminal視窗顯示後,放入背景程序執行,故原本執行指令的 terminal,可以再執行下個指令 )
若想踢掉可能會發生使用者不登出,造成殭屍(zombie)連線的 idle,則可以使用
ClientAliveInterval 0
ClientAliveCountMax 3
可改為
ClientAliveInterval 600
ClientAliveCountMax 3
偵測每 600 秒 1 次,最多 3 次,則剔除此 ssh 登入之 session,也就是半小時內沒有活動,就剔除。(類似提高翻桌率嗎XD)
接下來設定 chroot jail ( 限制可進出操作的資料夾範圍 )
ChrootDirectory none /* 啟用 ssh 的 chroot jail 可能會出現 無法使用 /bin /sbin /usr/bin /usr/sbin 的問題,故設定限制進出操作資料夾的範圍,要相當小心 */
除此之外,可以設定禁止使用者跳躍至的目錄路徑,也可保持預設值 none (無限制),若要針對個人使用者與群組進行sftp 的 chroot jail,並限制僅能使用 sftp 登入,可使用以下設定:
Match User jailuser # jailuser 為要限制的帳號名稱
ChrootDirectory /home
X11Forwarding no
AllowTCPForwarding no
PermitTTY no
ForceCommand internal-sftp
Match Group jailgroup # jailgroup 為要限制的帳號名稱
ChrootDirectory /home
X11Forwarding no
AllowTCPForwarding no
PermitTTY no
ForceCommand internal-sftp
/* 請記得要先用 useradd 跟 groupadd 創造 jailuser 跟 jailgroup 來分開正常ssh登入的帳號與群組,ChrootDirector 的資料夾,擁有者與群組皆需要換成 root。也就是說,若您ChrootDirecotory 的資料夾為/first/second ,則需要使用指令 chown root:root /first/second。但下一層如為 /first/second/third,則需使用指令chown jailuser:jailgroup /first/second/third ,來變更可上傳寫入權限。 */
-------------------------------------------------------------------
若要開啟 selinux chroot 可寫入 ${HOME},則需設定
$ setsebool -P ssh_chroot_rw_homedirs=1
$ setsebool -P selinuxuser_use_ssh_chroot=1
若為 ssh chroot jail,則需要複製 /dev/random /usr/lib,/usr/local,/usr/bin,/bin
,/etc/等內容至限制的${HOME}路徑下,否則會有指令操作上的錯誤。
接著將 jailuser 的 shell 改為 /usr/libexec/openssh/sftp-server,並將 /usr/libexec/openssh/sftp-server加入/etc/shells 內的 shell 清單中,如下
$ usermod -s /usr/libexec/openssh/sftp-server jailuser
$ echo '/usr/libexec/openssh/sftp-server' >> /etc/shells
若要使用 sftp 服務,請注意以下約 133行設定是否有開啟:
Subsystem sftp /usr/libexec/openssh/sftp-server
@vsftp
緊接著,要跟讀者說明如何架設 CentOS6_x64 下的 ftp 伺服器軟體,CentOS6_x64下之 ftp 伺服器軟體預設為 vsftpd ( https://security.appspot.com/vsftpd.html )。如同之前說明過的軟體安裝步驟,先利用 rpm 搜尋是否有安裝,若無,再利用 yum install vsftpd 安裝,安裝過程便不再贅述。我們直接從 vsftpd 的設定檔 /etc/vsftpd/vsftpd.conf 來說明設定,請使用 vim 來開啟並編輯,如圖4-7-1與圖4-7-2,亦因為設定檔太長,筆者分成兩個檔案說明:
(圖 4-7-1)
(圖 4-7-2)
設定參數值的方式類似於 sshd_config,檔案內的說明文件十分很詳細,設定前可參考,筆者直接提出要設定的參數,由上而下來說明:
anonymous_enable = NO
/* 若 vsftpd 僅允許用帳號密碼登入,則設定為 NO,否則僅需要輸入 anonymous@mail 的 email 帳號便能直接登入 */
write_enable = NO
/* 若僅分享下載,而無上傳或允許編輯檔案與資料夾,請將此設定值設定為 NO,否則就會有被更改檔案的風險 */
anon_upload_enable = NO
anon_mkdir_write_enable = NO
/* 當 write_enable 為 YES,也請將匿名使用者上傳設定為 NO, 若 write_enable 為 NO,則此亦無作用,無須變更 */
dirmessage_enable = NO
/* 若有製作 .message 檔案,便顯示檔案內容。 */
chroot_local_user =YES
chroot_list_enable = YES
chroot_list_file=/etc/vsftpd/chroot_list
/* 上述三項建立 chroot 清單, chroot 可以防止使用者離開家目錄,而其他資料夾做不安全的操作,而此時,建立在 /etc/vsfptd/chroot_list 清單內的使用者帳號,是可以允許跳躍至其他資料夾 。若是對於大多數使用者帳號允許跳躍其他資料夾,則將 chroot_local_user=NO, 而這狀態下, /etc/vsftpd/chroot_list 清單內的使用者帳號,便成為不能跳躍的使用者帳號 ,且 chroot_list_file 需搭配 chroot_list_enable 參數才有作用。 */
userlist_enable = YES
userlist_deny = YES
userlist_file=/etc/vsftpd/userlist
/* 此 userlist 開頭之設定參數,為設定禁止連入的使用者帳號,在 /etc/vsftpd/userlist 之內的使用者帳號,是被禁止登入的。 */
listen_address = 192.168.100.200
/* 若多主機 IP,則僅允許 192.168.100.200 此 IP 可供 vsftpd 連線 */
max_clients = 5
max_per_ip = 2
/* 上方設定為給定最多機器,與每個IP可以連線的 session 數,為了頻寬的控管 */
idle_session_timeout = 600
/* 10分鐘內皆無使用指令動作,就踢出使用者 */
除此之外,還可以設定使用者使用頻寬
local_max_rate = 131072 # 單位 byte/second
針對個別使用者,可利用設定檔
user_config_dir=/etc/vsftpd/mycfg
假如有一個使用者名稱為 ftpuser,則將 local_max_rate 設定值寫入檔案 /etc/vsftpd/mycfg/ftpuser
接著此時若啟動 vsftpd來使用,無論在帳號與密碼傳輸,或是資料的傳輸之間,都是無加密的狀態,有心人僅需要透過監控軟體( packet sniffer,如https://www.wireshark.org/,http://sectools.org/tag/sniffers/),便可得知帳號密碼與您在操作的資料,監視您的所有動作,為了不讓自己變成〝楚門的世界〞,故我們須利用 openssl 來加密登入與傳輸資料
,可加入如以下:
ssl_enable = YES #此時已滿足 over ssl explicit 條件
allow_anon_ssl = YES
force_local_data_ssl = YES
force_local_logins_ssl = YES
ssl_tlsv1 = YES # 使用 tls 1.X版
ssl_sslv2 = NO # ssl 2.0設成 YES 啟用亦可,但安全性較 tls 低
ssl_sslv3 = NO # ssl 3.0設成 YES 啟用亦可,但安全性較 tls 低
/* 以上為 ssl 加密在 ftp 傳輸的啟用,我們利用 tls,關於 ssl/tls 可參考 wikipedia 說明https://en.wikipedia.org/wiki/Transport_Layer_Security */
rsa_cert_file = /etc/vsftpd/myftp.pem # 若要使用 implicit ssl ,請設定憑證的路徑位置並加上
implicit_ssl=YES
若要啟用 PASV 模式 ( https://en.wikipedia.org/wiki/File_Transfer_Protocol,https://winscp.net/eng/docs/ftp_modes,https://wiki.filezilla-project.org/Network_Configuration )
則設定如以下
pasv_enable = YES
pasv_min_port = 10010
pasv_max_port = 10020 /* 僅開放 10 個動態 port 供 pasv 模式連線 */
最後設定完,儲存離開後,要記得防火牆也要開啟允許此連接埠範圍,如下
$ iptables -I INPUT -p tcp --dport 10010:10020 -j ACCEPT
$ setsebool -P ftpd_use_passive_mode 1 #開啟selinux的允許
除此之外,vsftpd 也可以自訂連接埠號,如以下:
listen_port = 990
ftp_data_port = 989 # 舊名稱 connect_from_port_20,ftp 資料傳輸埠
/* 一般 ftp port 為 21,資料傳輸埠 20,ftp over ssl/tls 的 ftps (https://en.wikipedia.org/wiki/FTPS)預設連結埠號 990,資料傳輸埠號 989,也可改成如連結埠號 9527,傳輸埠號 10978,但請記得 防火牆設定 也需要跟著換 */
以上做完設定後,儲存 /etc/vsftpd.conf 檔案後離開。接著再針對上面給的 .pem 憑證路徑,利用 openssl 產生 x509 憑證證書(https://en.wikipedia.org/wiki/X.509),再轉換成私密金鑰 .pem,並利用 RSA 加密,
$ openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/vsftpd/myftp.key -out \ /etc/vsftpd/myftp.pem
/* 符號 \ 為接續下行,建立可以使用10年(3650天)的憑證,一般都建議每次設定一年(365天),一樣產生 RSA 2048bits 長度的密碼 */
或利用以下方法,只要確定指向的路徑與參數設定可配合即可:
$ cd /etc/pki/tls/certs
$ make myftp.pem
$ cp myftp.pem /etc/vsftpd/
/* 以上會詢問輸入憑證所需的資訊 ,就依所知的資訊輸入,未知就預設,讀者選擇習慣使用的產生器就好 */
緊接著
$ mv myftp.pem /etc/vsftpd/ # 移動憑證給 vsftpd 用
$ chmod go-rxw /etc/vsftpd/myftp.pem # 修改憑證權限或 chmod 600
亦記得要加入 iptables 允許,如果僅需使用 port 21的讀者,請自行改 --dport 後方的值。
$ iptables -A INPUT -i eth0 -p tcp --dport 990 -j ACCEPT
$ iptables-save
接著同樣需考慮解除 SELinux 對連線埠的封鎖
$semanage port -l | grep ftp
$ semanage port -a -t ftp_port_t -p tcp 990
要解除 SELinux 對 home 目錄的 ftp 存取
$ setsebool -P ftp_home_dir 1
$ setsebool -P allow_ftpd_full_access 1
通常安裝好 CentOS6_x64 作業系統後,sshd, ssh daemon 的服務功能是預設開啟的,如筆者的前面篇章所述,預設的 iptables 防火牆設定,亦是開啟讓 ssh 的連線是可通過的,不僅可以連出,也可以被連入。若要確認是否有安裝 sshd 套件以及在啟動時的 runlevel 2 3 5 是否有被載入,可以使用以下指令搜尋:
$ rpm -qa | grep openssh # ssh 與 sshd 連線服務皆由 openssh 應用軟體提供。
或使用以下
$ rpm -qa | grep ssh # 比用關鍵字 openssh 搜尋更模糊,故符合的條件更多。
如圖4-1可以查詢到有關於 openssh-client 與 openssh-server 的套件, openssh-server 便是提供連入服務的軟體,openssh-client 為提供可以連出的工具。若無以上套件,則使用 yum install openssh ,則可下載安裝。
(圖4-1)
再接著輸入以下指令查詢到 sshd 這個服務,是否有再開機程序內載入,如圖4-2
$ chkconfig | grep ssh # 查詢 sshd 是否有於 開機 runlevel 啟動
再利用以下指令,來查詢是否防火牆有允許連線
$ iptables -L | grep ssh # 出現如圖4-2 允許通過之條件
(圖4-2)
接下來,我們要先來調整 sshd 的設定檔,利用 vim /etc/sshd/sshd_conf,如圖4-3-1與4-3-2。因為設定檔參數很多,筆者為方便說明,將 /etc/sshd/sshd_conf 檔案內容分成兩張圖。
(圖4-3-1)
(圖4-3-2)
首先,筆者強烈建議設定前,先閱讀 /etc/ssh/sshd_config 檔案內容前幾行的說明,如之前我們做任何的服務設定前,務必閱讀說明文字。說明告訴我們,若要更動預設參數設定,可以移除符號 # ,並更改後面的參數值。而我們要改動的參數主要為以下幾項:
Port 22
/* 一般 ssh 預設的 port 為 22,所以〝你知道、我知道、獨眼龍也知道〞,故建議可以更換預設 port ,以防被有惡意的人方便嘗試連線。 */
故我們暫將埠號 22 換成 5978,如以下設定即可,往後說明之設定參數名稱與設定值亦由此方式表示:
故我們暫將埠號 22 換成 5978,如以下設定即可,往後說明之設定參數名稱與設定值亦由此方式表示:
Port 5978
變更埠號後,請注意 SELinux 的限制問題,可以使用 SELinux 管理工具 semanage 來管理,若無 semanage 指令可使用,可以用 yum -y install policycoreutils-python 來重新安裝。接著利用指令(如圖4-4)
$ semanage port -l | grep ssh
/* 列出受到 SELinux 管理開放的 port,並搜尋關於 ssh 的字串行 */
$ semanage port -a -t ssh_port_t -p tcp 5978
/* 參數 -a 為增加, -t 為目標物件名稱,我們要加到剛搜尋到的名稱 ssh_port_t ,參數 -p 為 protocol,我們要開啟 tcp,埠號為 5978。 */
(圖4-4)
亦記得要加入 iptables 允許
$ iptables -A INPUT -i eth0 -p tcp --dport 5978 -j ACCEPT
$ iptables-save
亦記得要加入 iptables 允許
$ iptables -A INPUT -i eth0 -p tcp --dport 5978 -j ACCEPT
$ iptables-save
連接埠號更換後,利用 ssh 連線,需注意要輸入埠號的問題,若是用預設埠號 22 無需特別輸入埠號,如指令 ssh -2 -p 5978 newuser@192.168.100.100,亦可以調整連出主機的 /etc/ssh/ssh_config 的內容,或利用加入環境變數設定 alias ssh 'ssh -2 -p 5978' 來取代,或 加入設定檔的內容。
如機器上有好幾個 IP,可修改以下參數:
ListenAddress 0.0.0.0
設定為
ListenAddress 192.168.100.200
讓 sshd 僅在 192.168.100.200 這一個 IP 上開放服務
Protocol 2
/* 此部分維持預設,僅利用較安全的 sshd 2 版協定連線,連出主機端亦對應輸入 ssh -2 */
若要調整登入提示等待時間,以增強安全性效果,約 41行附近有一個
LoginGraceTime 2m
可修改為
LoginGraceTime 1m
主要將連線登入提示輸入帳號與密碼時間,縮短至 1 分鐘。
再接著有關帳號安全性問題
PermitRootLogin yes
預設為可允許 root 遠端登入,雖然對管理者很方便,但對入侵系統的人,也很方便。故請改為 no,並多加上一參數 AllowUsers ,可指定只有那些帳號可用遠端 ssh 登入,如以下:
PermitRootLogin no # 禁止直接用 root 登入,防止惡意人士用 root 試密碼登入
AllowUsers newuser # 很常用的重要設定
或設定僅允許哪些 group,藉以縮小可使用範圍,可輸入以下
AllowGroups misgroup
若要防止機器人程式不斷嘗試錯誤,來試圖非法登入,可更改以下參數
MaxAuthTries 6
更改改為
MaxAuthTries 3
讓登入只能嘗試 3 次錯誤就踢掉程序,重新登入,以防暴力法方式來試帳號與密碼。
MaxSessions 10
也可以設定為每個來源連線IP,能同時開啟 sessions 的最大次數,可改少,亦可維持預設。
若要使用無密碼登入,請開啟 49-50 行附近的
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
/* 此為提供 sshd 服務端的公鑰檔案名稱,搭配無密碼ssh登入 */
無密碼登入方式,可先在自己的家目錄下 cd ~ ,利用指令 ssh-keygen -t rsa -b 2048 來產生長度 2048bits 的 RSA演算法成對金鑰檔 (或在較新版本的 openssh 內, ssh-keygen -t ecdsa -b 256 產生長度 256bits 的 ECC DSA演算法的成對金鑰檔 ,如圖4-5,這裡有篇 RSA 與 ECDSA 之比較,https://koclab.cs.ucsb.edu/teaching/ecc/project/2015Projects/Levy.pdf ),並設定檔案位置為 ~/.ssh/id_rsa,此時 ssh-keygen 會建立身分檔 ~/.ssh/id_rsa 與一個公鑰(public key) ~/.ssh/rd_rsa.pub, 進入產生畫面後,皆輸入鍵盤Enter鍵即可。接著再利用 scp 將公鑰複製到提供 sshd 連線的遠端電腦主機,並將公鑰名稱改為 ~/.ssh/authorized_key( sshd_config 內預設為主 ),若遠端主機內無 .ssh 資料夾,請利用 ssh 192.168.100.200 'mkdir ~/.ssh' 新增。接著利用指令如下
$ scp ~/.sshid_rsa.pub 192.168.100.200:~/.ssh/authorized_key
或
$ scp ~/.sshid_ecdsa.pub 192.168.100.200:~/.ssh/authorized_key
為了安全性,請將 .ssh 資料夾設定成僅擁有的使用者可讀寫,如 chmod 600 ~/.ssh 。故提供連線的遠端電腦主機,帳號家目錄下 ~/.ssh/ 一定要包含連出端電腦主機產生的 ~/.ssh/id_*.pub 的公鑰資訊,與身分檔 ~/.ssh/id_* 成對。如圖4-5為利用 ecdsa 演算法產生公鑰
(圖4-5)
若公開金鑰配對有成功後,會如圖4-6,筆者利用無密碼ssh,直接利用金鑰登入真實的遠端主機,此方式在內部網路的叢集式電腦管理,相當實用。例如,可以直接 ssh 192.168.100.200 ! ls -al (符號 ! 一般指執行遠端主機的命令 ),直接對著 192.168.100.200 下指令,再搭配 shell script ,是不是就可以同時對著好幾台主機操作與管理呢?除此之外,若再搭配上 NFS 的網路硬碟系統,將發送端主機的磁碟給接收端主機們掛載,是不是就能利用這些接收端主機的計算資源,來幫忙處理發送端主機,需要較多計算資源的工作?聰明的讀者,可以用心想想,這可以有哪些好功用可以讓多主機管理或操作更方便。
(圖4-6)
緊接著,若要使用遠端主機 X11 之 X Windows ,請在約 110行 附近設定,如下
X11Forwarding yes # 預設為開啟
若想在低速網路環境中傳輸較大的封包,可利用約 119 行的 Compression 參數值,在連出的主機端,亦可搭配 ssh -C (但 man ssh 說明中,僅適合低速網路環境使用,如modem,在較高速的網路環境,反而會降低速度) 來連線。 修改 Compression 參數值如下:
Compression delayed
改為
Compression yes
若需使用 X Windows 連線至遠端工作的機器,再連出端可以利用指令 ssh -Y 192.168.100.200
( 參數 -Y 為直接允許 forwarding, 或是 ssh -X ),連線過去後,就可以執行 X Windows 的程式,如 /usr/bin/gnome-terminal & ( 使用符號 & 為將gnome-terminal視窗顯示後,放入背景程序執行,故原本執行指令的 terminal,可以再執行下個指令 )
若想踢掉可能會發生使用者不登出,造成殭屍(zombie)連線的 idle,則可以使用
ClientAliveInterval 0
ClientAliveCountMax 3
可改為
ClientAliveInterval 600
ClientAliveCountMax 3
偵測每 600 秒 1 次,最多 3 次,則剔除此 ssh 登入之 session,也就是半小時內沒有活動,就剔除。(類似提高翻桌率嗎XD)
接下來設定 chroot jail ( 限制可進出操作的資料夾範圍 )
ChrootDirectory none /* 啟用 ssh 的 chroot jail 可能會出現 無法使用 /bin /sbin /usr/bin /usr/sbin 的問題,故設定限制進出操作資料夾的範圍,要相當小心 */
除此之外,可以設定禁止使用者跳躍至的目錄路徑,也可保持預設值 none (無限制),若要針對個人使用者與群組進行sftp 的 chroot jail,並限制僅能使用 sftp 登入,可使用以下設定:
Match User jailuser # jailuser 為要限制的帳號名稱
ChrootDirectory /home
X11Forwarding no
AllowTCPForwarding no
PermitTTY no
ForceCommand internal-sftp
Match Group jailgroup # jailgroup 為要限制的帳號名稱
ChrootDirectory /home
X11Forwarding no
AllowTCPForwarding no
PermitTTY no
ForceCommand internal-sftp
/* 請記得要先用 useradd 跟 groupadd 創造 jailuser 跟 jailgroup 來分開正常ssh登入的帳號與群組,ChrootDirector 的資料夾,擁有者與群組皆需要換成 root。也就是說,若您ChrootDirecotory 的資料夾為/first/second ,則需要使用指令 chown root:root /first/second。但下一層如為 /first/second/third,則需使用指令chown jailuser:jailgroup /first/second/third ,來變更可上傳寫入權限。 */
-------------------------------------------------------------------
若要開啟 selinux chroot 可寫入 ${HOME},則需設定
$ setsebool -P ssh_chroot_rw_homedirs=1
$ setsebool -P selinuxuser_use_ssh_chroot=1
若為 ssh chroot jail,則需要複製 /dev/random /usr/lib,/usr/local,/usr/bin,/bin
,/etc/等內容至限制的${HOME}路徑下,否則會有指令操作上的錯誤。
接著將 jailuser 的 shell 改為 /usr/libexec/openssh/sftp-server,並將 /usr/libexec/openssh/sftp-server加入/etc/shells 內的 shell 清單中,如下
$ usermod -s /usr/libexec/openssh/sftp-server jailuser
$ echo '/usr/libexec/openssh/sftp-server' >> /etc/shells
若要使用 sftp 服務,請注意以下約 133行設定是否有開啟:
Subsystem sftp /usr/libexec/openssh/sftp-server
設定後記得儲存離開,並利用以下指令重啟動
$ service sshd restart
並利用指令 netstat 如以下
$ netstat -tlnp | grep 5978 # 查詢是否有聽 tcp 的埠號 5978 的服務,如果沒調整,預設是22
若欲連出 sftp 的電腦主機,可打上指令
$ sftp 192.168.100.200 -P 5978 # 如果埠號為 5978
進入 sftp> 介面後,再以輸入鍵盤 ? ,來查詢可用的 sftp 指令,大致類似 ftp。需要利用圖形連線 sftp,或 Windows下連線 sftp 的使用者,亦可利用 FileZilla Client ,可從 https://filezilla-project.org/ 下載,圖形部分有圖有真相,筆者就不在介紹 FileZilla 操作方式,再請讀者自行下載後玩一玩,應該很快能上手。
$ sftp 192.168.100.200 -P 5978 # 如果埠號為 5978
進入 sftp> 介面後,再以輸入鍵盤 ? ,來查詢可用的 sftp 指令,大致類似 ftp。需要利用圖形連線 sftp,或 Windows下連線 sftp 的使用者,亦可利用 FileZilla Client ,可從 https://filezilla-project.org/ 下載,圖形部分有圖有真相,筆者就不在介紹 FileZilla 操作方式,再請讀者自行下載後玩一玩,應該很快能上手。
@vsftp
緊接著,要跟讀者說明如何架設 CentOS6_x64 下的 ftp 伺服器軟體,CentOS6_x64下之 ftp 伺服器軟體預設為 vsftpd ( https://security.appspot.com/vsftpd.html )。如同之前說明過的軟體安裝步驟,先利用 rpm 搜尋是否有安裝,若無,再利用 yum install vsftpd 安裝,安裝過程便不再贅述。我們直接從 vsftpd 的設定檔 /etc/vsftpd/vsftpd.conf 來說明設定,請使用 vim 來開啟並編輯,如圖4-7-1與圖4-7-2,亦因為設定檔太長,筆者分成兩個檔案說明:
(圖 4-7-1)
(圖 4-7-2)
設定參數值的方式類似於 sshd_config,檔案內的說明文件十分很詳細,設定前可參考,筆者直接提出要設定的參數,由上而下來說明:
anonymous_enable = NO
/* 若 vsftpd 僅允許用帳號密碼登入,則設定為 NO,否則僅需要輸入 anonymous@mail 的 email 帳號便能直接登入 */
write_enable = NO
/* 若僅分享下載,而無上傳或允許編輯檔案與資料夾,請將此設定值設定為 NO,否則就會有被更改檔案的風險 */
anon_upload_enable = NO
anon_mkdir_write_enable = NO
/* 當 write_enable 為 YES,也請將匿名使用者上傳設定為 NO, 若 write_enable 為 NO,則此亦無作用,無須變更 */
dirmessage_enable = NO
/* 若有製作 .message 檔案,便顯示檔案內容。 */
chroot_local_user =YES
chroot_list_enable = YES
chroot_list_file=/etc/vsftpd/chroot_list
/* 上述三項建立 chroot 清單, chroot 可以防止使用者離開家目錄,而其他資料夾做不安全的操作,而此時,建立在 /etc/vsfptd/chroot_list 清單內的使用者帳號,是可以允許跳躍至其他資料夾 。若是對於大多數使用者帳號允許跳躍其他資料夾,則將 chroot_local_user=NO, 而這狀態下, /etc/vsftpd/chroot_list 清單內的使用者帳號,便成為不能跳躍的使用者帳號 ,且 chroot_list_file 需搭配 chroot_list_enable 參數才有作用。 */
userlist_enable = YES
userlist_deny = YES
userlist_file=/etc/vsftpd/userlist
/* 此 userlist 開頭之設定參數,為設定禁止連入的使用者帳號,在 /etc/vsftpd/userlist 之內的使用者帳號,是被禁止登入的。 */
listen_address = 192.168.100.200
/* 若多主機 IP,則僅允許 192.168.100.200 此 IP 可供 vsftpd 連線 */
max_clients = 5
max_per_ip = 2
/* 上方設定為給定最多機器,與每個IP可以連線的 session 數,為了頻寬的控管 */
idle_session_timeout = 600
/* 10分鐘內皆無使用指令動作,就踢出使用者 */
除此之外,還可以設定使用者使用頻寬
local_max_rate = 131072 # 單位 byte/second
針對個別使用者,可利用設定檔
user_config_dir=/etc/vsftpd/mycfg
假如有一個使用者名稱為 ftpuser,則將 local_max_rate 設定值寫入檔案 /etc/vsftpd/mycfg/ftpuser
接著此時若啟動 vsftpd來使用,無論在帳號與密碼傳輸,或是資料的傳輸之間,都是無加密的狀態,有心人僅需要透過監控軟體( packet sniffer,如https://www.wireshark.org/,http://sectools.org/tag/sniffers/),便可得知帳號密碼與您在操作的資料,監視您的所有動作,為了不讓自己變成〝楚門的世界〞,故我們須利用 openssl 來加密登入與傳輸資料
,可加入如以下:
ssl_enable = YES #此時已滿足 over ssl explicit 條件
allow_anon_ssl = YES
force_local_data_ssl = YES
force_local_logins_ssl = YES
ssl_tlsv1 = YES # 使用 tls 1.X版
ssl_sslv2 = NO # ssl 2.0設成 YES 啟用亦可,但安全性較 tls 低
ssl_sslv3 = NO # ssl 3.0設成 YES 啟用亦可,但安全性較 tls 低
/* 以上為 ssl 加密在 ftp 傳輸的啟用,我們利用 tls,關於 ssl/tls 可參考 wikipedia 說明https://en.wikipedia.org/wiki/Transport_Layer_Security */
rsa_cert_file = /etc/vsftpd/myftp.pem # 若要使用 implicit ssl ,請設定憑證的路徑位置並加上
implicit_ssl=YES
若要啟用 PASV 模式 ( https://en.wikipedia.org/wiki/File_Transfer_Protocol,https://winscp.net/eng/docs/ftp_modes,https://wiki.filezilla-project.org/Network_Configuration )
則設定如以下
pasv_enable = YES
pasv_min_port = 10010
pasv_max_port = 10020 /* 僅開放 10 個動態 port 供 pasv 模式連線 */
最後設定完,儲存離開後,要記得防火牆也要開啟允許此連接埠範圍,如下
$ iptables -I INPUT -p tcp --dport 10010:10020 -j ACCEPT
$ setsebool -P ftpd_use_passive_mode 1 #開啟selinux的允許
除此之外,vsftpd 也可以自訂連接埠號,如以下:
listen_port = 990
ftp_data_port = 989 # 舊名稱 connect_from_port_20,ftp 資料傳輸埠
/* 一般 ftp port 為 21,資料傳輸埠 20,ftp over ssl/tls 的 ftps (https://en.wikipedia.org/wiki/FTPS)預設連結埠號 990,資料傳輸埠號 989,也可改成如連結埠號 9527,傳輸埠號 10978,但請記得 防火牆設定 也需要跟著換 */
以上做完設定後,儲存 /etc/vsftpd.conf 檔案後離開。接著再針對上面給的 .pem 憑證路徑,利用 openssl 產生 x509 憑證證書(https://en.wikipedia.org/wiki/X.509),再轉換成私密金鑰 .pem,並利用 RSA 加密,
$ openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/vsftpd/myftp.key -out \ /etc/vsftpd/myftp.pem
/* 符號 \ 為接續下行,建立可以使用10年(3650天)的憑證,一般都建議每次設定一年(365天),一樣產生 RSA 2048bits 長度的密碼 */
或利用以下方法,只要確定指向的路徑與參數設定可配合即可:
$ cd /etc/pki/tls/certs
$ make myftp.pem
$ cp myftp.pem /etc/vsftpd/
/* 以上會詢問輸入憑證所需的資訊 ,就依所知的資訊輸入,未知就預設,讀者選擇習慣使用的產生器就好 */
緊接著
$ mv myftp.pem /etc/vsftpd/ # 移動憑證給 vsftpd 用
$ chmod go-rxw /etc/vsftpd/myftp.pem # 修改憑證權限或 chmod 600
亦記得要加入 iptables 允許,如果僅需使用 port 21的讀者,請自行改 --dport 後方的值。
$ iptables -A INPUT -i eth0 -p tcp --dport 990 -j ACCEPT
$ iptables-save
接著同樣需考慮解除 SELinux 對連線埠的封鎖
$semanage port -l | grep ftp
$ semanage port -a -t ftp_port_t -p tcp 990
$ setsebool -P ftp_home_dir 1
$ setsebool -P allow_ftpd_full_access 1
設定後記得儲存離開,並利用以下指令重啟動
$ service vsftpd restart
再加入開機時的啟動,確保重開機可以自動化執行
$ chkconfig --level 235 vsftpd on
再加入開機時的啟動,確保重開機可以自動化執行
$ chkconfig --level 235 vsftpd on
並利用指令 netstat 查詢是否有成功啟用,如以下
$ netstat -tlnp | grep 990 # 查詢是否有聽 tcp 的埠號 990 的服務
在CentOS6_x64 的環境下設定伺服器軟體的開啟,請記得設定檔的參數設定完,重啟前要考慮防火牆 iptables 的規則是否有允許,以及使用指令 getsebool -a 來看 SELinux 的權限是否有開啟,如圖4-8 ,因參數太多太長,筆者僅節錄第一頁設定,請讀者在利用 grep 來搜尋跟服務名稱有關的設定值。SELinux 除了設定此 boolean 值外,還要考慮到資料夾的寫入,如 ls -lZ ~,-Z 可以列出 SELinux 的控制內容,如圖4-9,再使用 chcon -t public_content_rw_t ~/ ,可允許上傳寫入自己的家目錄資料夾。雖然 SELinux 會給定很多限制,但若讀者遇到了參數設定都沒錯,卻無法使用服務時,再想到關於 SELinux 的限制開放,應該就是解開問題的關鍵了,故筆者真的不建議關閉 SELinux 的安全防護功能。
(圖4-8)
圖4-9,利用指令 semanage fcontext -l | grep ~/,來查詢在自己家目錄下的 SELinux 安全性文件設定值。其他設定與利用 lftp 文字介面登入方式,讀者可以參考網頁 https://access.redhat.com/solutions/3436 的詳細說明,或其他可設定之參數可參考 http://vsftpd.beasts.org/vsftpd_conf.html,筆者就不再多加贅述。
(圖4-9)
基本上來說,架設伺服器軟體,不外乎反覆考慮以下幾點:
1. Whom,可以使用服務的帳號,帳號的上傳與下載權限的規劃。
2. Where,可以連入的 IP 位置或電腦名稱要的拒絕與允許設定,以及連接埠的更改或預設。
3. Which,連入後可到哪裡寫資料夾或檔案,每個資料夾或檔案的權限考量。
4. What System Load,機器可以承受多少 session 連線數,多少網路頻寬使用,並考量單一帳號可使用量,與全部帳號總量
5. How Network Security,連線的加密,無論在登入的帳號密碼,或是連線傳輸的資料上,皆須加上編碼,如 SSL/TLS的加密
無論是 sshd 或 vsftpd 這些類固定式的參數設定方式,我們亦可利用 script ,製作一鍵設定懶人包,僅利用 指令 sed 取代參數值 與 指令 echo " " >> ,來加入新增的參數名稱與值,就可以一次設定好並啟動,若有機會,筆者會在後面附錄篇幅探討,讀者亦可以自行先試試,應該是很好玩的設定經驗。
下一節,筆者要介紹利用 CentOS6_x64 架設收發 email 的伺服器軟體,往後可以搭配 php 等 CGI 網頁程式設計工具,來做到利用網頁平台收發 email 機制,可行動化收發 email,與使用網頁電子郵件 Webmail 軟體(如 roundcube,https://roundcube.net/ )架設中小企業的 Webmail。
(圖4-8)
圖4-9,利用指令 semanage fcontext -l | grep ~/,來查詢在自己家目錄下的 SELinux 安全性文件設定值。其他設定與利用 lftp 文字介面登入方式,讀者可以參考網頁 https://access.redhat.com/solutions/3436 的詳細說明,或其他可設定之參數可參考 http://vsftpd.beasts.org/vsftpd_conf.html,筆者就不再多加贅述。
(圖4-9)
基本上來說,架設伺服器軟體,不外乎反覆考慮以下幾點:
1. Whom,可以使用服務的帳號,帳號的上傳與下載權限的規劃。
2. Where,可以連入的 IP 位置或電腦名稱要的拒絕與允許設定,以及連接埠的更改或預設。
3. Which,連入後可到哪裡寫資料夾或檔案,每個資料夾或檔案的權限考量。
4. What System Load,機器可以承受多少 session 連線數,多少網路頻寬使用,並考量單一帳號可使用量,與全部帳號總量
5. How Network Security,連線的加密,無論在登入的帳號密碼,或是連線傳輸的資料上,皆須加上編碼,如 SSL/TLS的加密
無論是 sshd 或 vsftpd 這些類固定式的參數設定方式,我們亦可利用 script ,製作一鍵設定懶人包,僅利用 指令 sed 取代參數值 與 指令 echo " " >> ,來加入新增的參數名稱與值,就可以一次設定好並啟動,若有機會,筆者會在後面附錄篇幅探討,讀者亦可以自行先試試,應該是很好玩的設定經驗。
下一節,筆者要介紹利用 CentOS6_x64 架設收發 email 的伺服器軟體,往後可以搭配 php 等 CGI 網頁程式設計工具,來做到利用網頁平台收發 email 機制,可行動化收發 email,與使用網頁電子郵件 Webmail 軟體(如 roundcube,https://roundcube.net/ )架設中小企業的 Webmail。