FTP
讓我們透過 Network 在 Server 和 Client 之間傳遞檔案。
FTP 傳輸分兩種模式
- port FTP
- 一般狀態,port 為 21,port 20 為傳輸資料
- pasv FTP
- 屬於被動模式,port 也是 21。連線後使用者會跟 server 端要求資料傳輸的 port
常見 FTP 軟體有 Wuftpd
、Proftpd
、Vsftpd
、Pureftpd
等。因為學校是教學 Vsftpd 所以會以這個為主。
environment
- ubuntu 16
- IP 192.168.137.141
- vsftpd
- tool
- filezilla(驗證)
Install FTP
$ sudo apt-get install vsftpd -y
service enable
$ sudo systemctl start vsftpd # 啟動服務
$ sudo systemctl status vsftpd # 查看服務狀態
$ sudo systemctl stop vsftpd # 停用服務
Configuring FTP
通常服務配置檔都在 /etc
目錄下。利用 whereis 可以查找執行檔和原始檔。
$ whereis vsftpd
vsftpd: /usr/sbin/vsftpd /etc/vsftpd.conf /usr/share/man/man8/vsftpd.8.gz
Edit FTP file
$ sudo vim /etc/vsftpd.conf
Modify
anonymous_enable=NO # 禁用匿名者登入
local_enable=YES # 允許本機使用者登陸
write_enable=YES # 啟用更改檔案系統的 FTP 指令,允許使用者寫入,預設註解
local_umask=022 # 本機用戶的檔案創建的 umask 值,預設註解
dirmessage_enable=YES # 使用者進入目錄時顯示消息
xferlog_enable=YES # 維護一個 log 檔案,詳細紀載上傳和下載
connect_from_port_20=YES # 使用服務器機器上的端口 20(ftp-data)進行 PORT 樣式連接
xferlog_file=/var/log/vsftpd.log # 指定 log 檔案
xferlog_std_format=YES # 標準的 log 檔案格式,預設註解
listen=NO # 防止 vsftpd 在獨立模式下運行
listen_ipv6=YES # vsftpd 監聽 IPv6
pam_service_name=vsftpd # vsftpd 使用 PAM 服務的名稱
userlist_enable=YES # 使 vsftpd 限制使用者列表,須自行添加
tcp_wrappers=YES # 用來限制訪問,須自行添加
use_localtime=YES # 使用本地時間
secure_chroot_dir=/var/run/vsftpd/empty #不需要檔案權限時將指定到此目錄
idle_session_timeout=60 # 閒置 60 秒會將此使用者剔除,預設註解
allow_writeable_chroot=YES # 允許 chroot 能被寫入
force_dot_files=YES # 顯示隱藏檔案,須自行添加
download_enable=YES # 設置為 NO,則禁止下載
anon_max_rate=0 # 限制 ftp 傳輸速率,0 無限制。byte 為單位
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
Setting allow/deny FTP access
預設下,userlist_enable = YES
,則 userlist_file =/etc/vsftpd.userlist
中列出的用戶將被拒絕,使用 userlist_deny=YES
選項進行登錄訪問限制。
但是,選項 userlist_deny=NO
會扭曲預設設置的含義,因此只允許用戶名在 userlist_file=/etc/vsftpd.userlist
中明確列出的用戶登錄 FTP 服務器。
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
restrict FTP users to their Home directories
chroot_local_user=YES # 本機使用者將在登錄後,僅能在家目錄
allow_writeable_chroot=YES # 基於安全,vsftpd 不允許 chroot 目錄可寫,此設定可來禁用,須自行添加
FTP user connection settings
max_clients=3 # 最多三人連線使用,須自行添加
max_per_ip=3 # 同一 IP 最多三人連線,須自行添加
max_login_fails=2 # 最大登錄嘗試次數
delay_failed_login=10 # 嘗試登錄失敗,需要暫停的秒數
Testing FTP Server in Ubuntu
Add user
我們會以三個使用者做為測試。下面是新增使用者方式。
$ sudo useradd -m -c "Test Account" -s /bin/bash naruto
$ sudo passwd naruto
Testing userlist
先將使用者新增至 .userlist 檔案裡
$ echo "naruto" | sudo tee -a /etc/vsftpd.userlist
naruto
$ cat /etc/vsftpd.userlist
naruto
naruto 使用者
$ ftp localhost
Connected to localhost.
220 (vsFTPd 3.0.3)
Name (localhost:cch): naruto
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 EPRT command successful. Consider using EPSV.
150 Here comes the directory listing.
226 Directory send OK.
ftp>
itahi 使用者
$ ftp localhost
Connected to localhost.
220 (vsFTPd 3.0.3)
Name (localhost:cch): itahi
530 Permission denied.
Login failed.
ftp>
可以知道 itahi 被 .userlist
檔案限制住了,userlist_deny
是影響 .userlist
檔案的限制方式。
Anonymous connection FTP server
$ ftp localhost
Connected to localhost.
220 (vsFTPd 3.0.3)
Name (localhost:cch): anonymous
530 Permission denied.
Login failed.
ftp>
因為設定檔的配置,因此無法使用 anonymous 登入
Restrict users from home directory
創建一個群組,並將使用者帳號分配正確的擁有權和權限,也將用戶限制為家目錄或特定目錄。
Create users and groups
$ sudo groupadd ftpgroup
將 naruto 使用者加入至 ftpgroup
群組
$ sudo usermod -G ftpgroup naruto
$ id naruto # 查看帳號 UID、GID 等資訊
uid=1001(naruto) gid=1001(naruto) groups=1001(naruto),1003(ftpgroup)
再新增一個使用者 madara
至 ftpgroup
$ sudo useradd -G ftpgroup madara
$ sudo passwd madara
$ sudo usermod -s /sbin/nologin madara # 限制此用戶不能取得 shell
Modify SSH configuration
$ sudo vi /etc/ssh/sshd_config
# 新增以下
Subsystem sftp internal-sftp
Match Group ftpgroup
ChrootDirectory /home
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
$ sudo systemctl restart sshd.service
Verify
SSH
$ ssh -l naruto 192.168.137.141
The authenticity of host '192.168.137.141 (192.168.137.141)' can't be established.
ECDSA key fingerprint is SHA256:rNlo0Ial3bX7JECrwMtFUYzIAVUtN96i8d9sl9UgM2I.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.137.141' (ECDSA) to the list of known hosts.
naruto@192.168.137.141's password:
This service allows sftp connections only.
Connection to 192.168.137.141 closed.
sftp
$ sftp naruto@192.168.137.141
naruto@192.168.137.141's password:
Connected to 192.168.137.141.
sftp> ls
cch itahi naruto
Restrict users to a specific directory
將新使用者限制為自定義目錄
Create user and group
$ sudo groupadd ftpgroup2
$ sudo mkdir -p /sftp/chroot
$ sudo chown root:root /sftp/chroot/
$ sudo useradd -G ftpgroup2 -s /sbin/nologin brouto
$ sudo passwd brouto
$ sudo mkdir /sftp/chroot/brouto
$ sudo chown brouto:brouto /sftp/chroot/brouto/
$ sudo chmod 700 /sftp/chroot/brouto/
Modify SSH configuration
Subsystem sftp internal-sftp
Match Group ftpgroup2
ChrootDirectory /sftp/chroot/
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
Verify
$ sudo mkdir /sftp/chroot/manager
$ sftp brouto@192.168.137.141
brouto@192.168.137.141's password:
Connected to 192.168.137.141.
sftp> ls
brouto manager
sftp> cd manager/
sftp> ls
sftp> mkdir asd
Couldn't create directory: Permission denied # 將此登入使用者限制了
sftp>
透過 ssh 裡的 sftp 設定會有以下效果
- 使用者登入不允許進行 Shell 操作(只能使用 SFTP 傳輸檔案)
- 不允取使用者建立 SSH Tunnel(TCP Forwarding)
- 不允取使用者建立 X11 Forwarding
- 登入後透過 chroot 限制存取目錄,只能在自己家目錄新增刪除檔案目錄
若將多個使用者 chroot 到同一個目錄,應變更每個使用者家目錄的權限,防止所有使用者瀏覽其他使用者的家目錄。
Example
學校情境範例
須讓系統有一個使用者,user01 登入自己的目錄(/home/user01),密碼 passw0rd,此使用者不得遠端 SSH 燈入主機,僅准 FTP 連線。使用者不得切換其他使用者目錄。秀出隱藏檔案。使用者一分鐘沒動作就踢除。
答案在上面 XD,我是透過此情境加上上課內容寫出此篇文章。