File Transfer Protocol(FTP)

April 21, 2017

FTP

讓我們透過 Network 在 Server 和 Client 之間傳遞檔案。

FTP 傳輸分兩種模式

常見 FTP 軟體有 WuftpdProftpdVsftpdPureftpd 等。因為學校是教學 Vsftpd 所以會以這個為主。

environment

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)

再新增一個使用者 madaraftpgroup

$ 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 設定會有以下效果

若將多個使用者 chroot 到同一個目錄,應變更每個使用者家目錄的權限,防止所有使用者瀏覽其他使用者的家目錄。

Example

學校情境範例

須讓系統有一個使用者,user01 登入自己的目錄(/home/user01),密碼 passw0rd,此使用者不得遠端 SSH 燈入主機,僅准 FTP 連線。使用者不得切換其他使用者目錄。秀出隱藏檔案。使用者一分鐘沒動作就踢除。

答案在上面 XD,我是透過此情境加上上課內容寫出此篇文章。

Ref

vsftpd with SSL/TLS