๐ง Linux FTP Server ๆถ่จญๆๅญธ:ๅพ vsftpd ๅฎ่ฃๅฐไฝฟ็จ่ ๆฌ้่จญๅฎๅ จๆป็ฅ
้ฉๅๅๆฅ่งธไธปๆฉ็ถญ้็ไฝ :ๆฌๆ็จๆๅฏฆๅ็ๆนๅผ,ๅธถไฝ ๅพ 0 ้ๅงๅฎๆ FTP(vsftpd)ๅฎ่ฃ、ไฝฟ็จ่ ่ๆฌ้็ฎก็、้ฒ็ซ็/SELinux ่จญๅฎ่ TLS ๅ ๅฏ。
๐ ็ฎ้
- ไธ、็ฐๅข่ๅฅไปถๆบๅ
- ไบ、ๅฎ่ฃ vsftpd
- ไธ、ๆ ธๅฟ่จญๅฎ่ไฝฟ็จ่ ๆฌ้
- ๅ、้ฒ็ซ็(UFW/Firewalld)่ Passive Port
- ไบ、SELinux(CentOS/RHEL)ๆณจๆไบ้
- ๅ ญ、ๅ็จ SSL/TLS ๅ ๅฏ็ปๅ ฅ
- ไธ、ๆธฌ่ฉฆ่ๅธธ่ฆๅ้กๆๆฅ
- ๐งญ ่กๅๆธ ๅฎ
- ๐ ๅปถไผธ้ฑ่ฎ
ไธ、็ฐๅข่ๅฅไปถๆบๅ
vsftpd(Very Secure FTP Daemon)ไปฅๅฎๅ จ่็ฉฉๅฎ่ๅ,ไธปๆต็ผ่ก็็ๆไพๅฅไปถ。
# ๆชขๆฅ็ๆฌ่ไฝๆฅญ็ณป็ตฑ
cat /etc/os-release
uname -r
ไบ、ๅฎ่ฃ vsftpd
Debian/Ubuntu
sudo apt update
sudo apt install -y vsftpd
sudo systemctl enable --now vsftpd
sudo systemctl status vsftpd
RHEL/CentOS/Rocky/Alma
sudo dnf install -y vsftpd
sudo systemctl enable --now vsftpd
sudo systemctl status vsftpd
ไธ、ๆ ธๅฟ่จญๅฎ่ไฝฟ็จ่ ๆฌ้
ไธป่ฆ่จญๅฎๆช:/etc/vsftpd.conf。ไปฅไธ็บๅฎๅ
จ้ ่จญ่ๆฌๆฉไฝฟ็จ่
ไธๅณ็ๅธธ็จ็ตๅ:
ๅปบ่ญฐ่จญๅฎ็ๆฎต(ๅฏ็ดๆฅ่ฆ่/ๅไฝต)
# /etc/vsftpd.conf — ๅฎๅ
จๅบๆบ
listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
# ไธๅณๆชๆก้ ่จญๆฌ้(็ญๅ umask 022)
local_umask=022
# ้ๅถไฝฟ็จ่
ๅจๅฎถ็ฎ้(้ฟๅ
่ถๆฌ)
chroot_local_user=YES
allow_writeable_chroot=YES
# ่ขซๅๆจกๅผ;่ซ่้ฒ็ซ็ไธไฝต้ๆพ
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=50000
# ็ปๅ
ฅ่่จ้
xferlog_enable=YES
xferlog_std_format=NO
log_ftp_protocol=YES
# ๅ
ถไปๅผทๅ
use_localtime=YES
ftpd_banner=Welcome to WWFandy FTP Service.
# (ๅฆ้ๅ
่จฑ็นๅฎไฝฟ็จ่
):
# userlist_enable=YES
# userlist_file=/etc/vsftpd.userlist
# userlist_deny=NO # ๅ
ๅ
่จฑๅจๆธ
ๅฎไธญ็ๅธณ่
ๅปบ็ซๆฌๆฉๅธณ่่ไธๅณ่ณๆๅคพ
# ๅปบ็ซไธๅๅ
FTP ็จ้็ๅธณ่่่ณๆๅคพ
sudo adduser ftpuser
sudo passwd ftpuser
# ๆๅฎๅฏไธๅณ่ณๆๅคพ(็ฏไพ:/srv/ftp/ftpuser)
sudo mkdir -p /srv/ftp/ftpuser/upload
sudo chown -R ftpuser:ftpuser /srv/ftp/ftpuser
# ๅฐไฝฟ็จ่
ๅฎถ็ฎ้ๆนๅฐ /srv/ftp/ftpuser(ๅฏ้ธ)
sudo usermod -d /srv/ftp/ftpuser ftpuser
# ้ๅๆๅ
sudo systemctl restart vsftpd
(ๅฏ้ธ)ๅฟๅๅฏ่ฎไธ่ผ
่ฅ้ๅฐๅคๆไพๅ ฌ้ไธ่ผ,ๅฏๅ็จๅฟๅๆจกๅผไฝ้ฟๅ ๅฏซๅ ฅ:
# /etc/vsftpd.conf ๅข่ฃ
anonymous_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
# ๅฟๅๆ น็ฎ้(้ ่จญ /var/ftp,่ซๆพๅช่ฎๆชๆก)
# anon_root=/var/ftp/pub
ๅ、้ฒ็ซ็(UFW/Firewalld)่ Passive Port
FTP ็่ณๆ้ฃ็ทๅจ่ขซๅๆจกๅผไธๆ่ฝๅจไฝ ่จญๅฎ็ pasv_min_port..pasv_max_port ็ฏๅ,ๅๅฟ
ๆพ่ก。
UFW(Debian/Ubuntu)
sudo ufw allow 21/tcp
sudo ufw allow 40000:50000/tcp
sudo ufw reload
sudo ufw status
Firewalld(RHEL/CentOS/Rocky/Alma)
sudo firewall-cmd --permanent --add-service=ftp
sudo firewall-cmd --permanent --add-port=40000-50000/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
ไบ、SELinux(CentOS/RHEL)ๆณจๆไบ้
ๅ็จ SELinux ๆ,้่จญๅฎๅธๆๅผ่ๆชๆกๆจ็ฑค,็ขบไฟ FTP ๅฏ่ฎๅฏซๆญฃ็ขบ่ทฏๅพ。
# ๅ
่จฑ vsftpd ๅฏซๅ
ฅๆฌๆฉไฝฟ็จ่
ๅฎถ็ฎ้/ๆๅฎ่ทฏๅพ(ไพ้ๆฑๆไธๆๅค้
)
sudo setsebool -P ftpd_full_access on # ๅฏฌ้ฌ:ๅ
่จฑ vsftpd ่ฎๅฏซ(ๆ็ฐกๅฎ)
# ๆ่ผ็ฒพๆบๅๆณ:ๆจ่จป่ฆๆไพ็ไธ่ผ/ไธๅณ็ฎ้็บ public_content ๆ public_content_rw_t
sudo semanage fcontext -a -t public_content_rw_t "/srv/ftp(/.*)?"
sudo restorecon -Rv /srv/ftp
ๅฆ้ๅฟๅๅฏซๅ
ฅ(้ๅธธไธๅปบ่ญฐ),ๅฆๆ ftpd_anon_write ๅธๆๅผๅฏ็จ;่ซๅฏฉๆ
่ฉไผฐ้ขจ้ช。
ๅ ญ、ๅ็จ SSL/TLS ๅ ๅฏ็ปๅ ฅ
ๅณ็ตฑ FTP ๆๆๅณ่ผธๅธณๅฏ,ๅปบ่ญฐ่ณๅฐๅ ไธ TLS(FTPS)。ไปฅไธ็คบ็ฏ่ช็ฐฝๆ่ญๅฟซ้ๅ็จ:
# ็ข็่ช็ฐฝๆ่ญ(ๆๆ 1 ๅนด)
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/vsftpd.key \
-out /etc/ssl/certs/vsftpd.crt \
-subj "/C=TW/ST=Taiwan/L=Taipei/O=WWFandy/OU=IT/CN=ftp.example.com"
# vsftpd ๅ็จ TLS
sudo bash -c 'cat >> /etc/vsftpd.conf' << "EOF"
ssl_enable=YES
rsa_cert_file=/etc/ssl/certs/vsftpd.crt
rsa_private_key_file=/etc/ssl/private/vsftpd.key
force_local_logins_ssl=YES
force_local_data_ssl=YES
ssl_tlsv1_2=YES
ssl_sslv2=NO
ssl_sslv3=NO
EOF
sudo systemctl restart vsftpd
ๆญฃๅผ็ฐๅขๅฏไฝฟ็จๅ ฌๆ CA ๆ่ญ,ๆไปฅๅๅไปฃ็(ๅฆ Nginx/HAProxy)ๆไพ FTPS/FTP-over-TLS ็ต็ต。
ไธ、ๆธฌ่ฉฆ่ๅธธ่ฆๅ้กๆๆฅ
ๅบๆฌ้ฃ็ทๆธฌ่ฉฆ
# Linux ็จๆถ็ซฏ(ไบๅๅผ)
ftp -p <server-ip>
# ๅ
ไบๅ(lftp ๆจ่ฆ)
lftp -u ftpuser,****** -e "ls; put test.txt; bye" ftp://<server-ip>
# ๆชขๆฅ่ขซๅๆจกๅผ่ TLS
curl -v --ssl-reqd ftp://<server-ip>/ --user ftpuser:******
ๅธธ่ฆ้ฏ่ชค้ๆฅ
- ้ฃๅพไธไฝๅ่กจ/ไธๅณๅกไฝ:ๅคๅๆฏ
pasvๅ ๆฒๆพ่ก;ๅๆ็ขบ่ชไธปๆฉๅจ NAT ๅพๆฏๅฆ้pasv_address=<public-ip>。 - 530 Login incorrect:ๆชขๆฅไฝฟ็จ่ ๅฏ็ขผ、/etc/vsftpd.userlist(่ฅๆๅ็จ็ฝๅๅฎ)。
- 500 OOPS: vsftpd: refusing to run with writable root:ๅทฒ่จญ
chroot_local_user=YESๆ,่ซๆญ้ allow_writeable_chroot=YESๆ่ชฟๆดๅฎถ็ฎ้ๆฌ้。 - TLS ้ฃ็ท่ขซๆ:็ขบ่ช
ssl_enable่ๆ่ญ่ทฏๅพ;ๅฎขๆถ็ซฏๆฏๅฆๅ็จ「้่ฆๅ ๅฏ」。 - SELinux ๆ็ต:
/var/log/audit/audit.logๆฅ AVC ่จ้;ไปฅsealert -a็ข็ๅปบ่ญฐ;ๆๅ ็จftpd_full_access on้ฉ่ญ。
๐งญ ่กๅๆธ ๅฎ
✅ ๅฎ่ฃ vsftpd ไธฆๅฅ็จๅฎๅ
จๅบๆบ่จญๅฎ
✅ ๅปบ็ซ ftpuser,่จญๅฎๅฎถ็ฎ้่ไธๅณ่ณๆๅคพ
✅ ้ๅ TCP/21 ่ 40000–50000/tcp(UFW ๆ Firewalld)
✅ (RHEL ็ณป)่จญๅฎ SELinux ๆจ็ฑค่/ๆๅธๆๅผ
✅ ๅ็จ TLS(FTPS),ๅผทๅถๅธณๅฏ่่ณๆๆตๅ ๅฏ
✅ ไปฅ lftp/curl ้ฉ่ญๅ่กจ、ไธๅณ、TLS ๆๅ
๐ ๅปถไผธ้ฑ่ฎ
- Linux Proxy Server ๅปบ็ฝฎๆๅญธ(Squid)
- Linux ้ฒ็ซ็่ Fail2Ban:ๆๅไฟ่ญท่ Systemd ่ชๅๅ
- Linux Log ่ชๅๅ:GoAccess + Fail2Ban ๅฏฆๆฐ
— WWFandy・ไธป้ก็ญ่จ
ๆฒๆ็่จ:
ๅผต่ฒผ็่จ