備、配置調(diào)優(yōu)與排障實(shí)踐)
內(nèi)網(wǎng)服務(wù)器斷外網(wǎng)但又得往里傳文件、跟外部系統(tǒng)對接數(shù)據(jù)這種活兒我接過不止一次。離線搭建FTP服務(wù)器真正讓人頭疼的不是那幾行配置而是兩大步第一步怎么把安裝包弄進(jìn)一個沒有網(wǎng)的機(jī)器第二步裝完之后連不上、列不出目錄、傳不了文件全靠猜。這篇文章把我自己離線部署vsftpd的完整過程寫出來從在有網(wǎng)機(jī)器上準(zhǔn)備RPM/DEB包、做本地軟件源到配置文件逐條拆解、放行防火墻、調(diào)整SELinux再到常見坑的排查思路一條龍講清楚。適合在隔離網(wǎng)絡(luò)環(huán)境下做運(yùn)維和部署的同學(xué)直接照著操作。1. 為什么離線環(huán)境也要用FTP以及服務(wù)端怎么選1.1 離線部署的場景比你想的更常見很多人覺得現(xiàn)在的文件傳輸都該走HTTP接口或者SFTPFTP已經(jīng)過時了。但真到了生產(chǎn)環(huán)境你會發(fā)現(xiàn)很多自動化設(shè)備、老平臺、嵌入式終端只認(rèn)FTP協(xié)議數(shù)據(jù)交換鏈條上就缺這么一環(huán)。我遇到過的典型場景是這樣一臺剛上架的服務(wù)器部署在獨(dú)立網(wǎng)段除了內(nèi)網(wǎng)管理口之外沒有任何外網(wǎng)通道。業(yè)務(wù)系統(tǒng)需要跟另一套老系統(tǒng)做文件對接對方只支持通過FTP拉取或推送文件。這時候你手上就一臺機(jī)器、一個U盤和一紙變更申請。還有一種更常見的情況服務(wù)器本身能連內(nèi)網(wǎng)但內(nèi)網(wǎng)和外網(wǎng)是物理隔離的你沒法直接在服務(wù)器上執(zhí)行yum install或者apt install。這種“邏輯離線”的機(jī)器處理思路和完全離線一模一樣——必須把安裝包提前準(zhǔn)備好帶進(jìn)去。在這些場景里FTP仍然是投入產(chǎn)出比最高的方案因?yàn)榉?wù)端軟件體積小、配置簡單、客戶端兼容性極好任何系統(tǒng)自帶的命令行的ftp、瀏覽器、文件管理器都能連。先把服務(wù)搭起來解決業(yè)務(wù)問題后續(xù)再考慮要不要換成更安全的傳輸方式這是我在實(shí)際項(xiàng)目里的慣用策略。1.2 服務(wù)端軟件三選一vsftpd、proftpd、pure-ftpd開源的FTP服務(wù)端有不少但我實(shí)際部署下來基本就在三個里面選軟件特點(diǎn)配置復(fù)雜度資源占用適用場景vsftpd名字就是Very Secure FTP Daemon安全設(shè)計優(yōu)先各發(fā)行版?zhèn)}庫都自帶低單配置文件極低絕大多數(shù)常規(guī)場景默認(rèn)首選proftpd配置風(fēng)格類似Apache模塊化擴(kuò)展能力強(qiáng)中高中需要復(fù)雜虛擬主機(jī)、多域名、細(xì)粒度指令控制的場景pure-ftpd輕量自帶Web管理面板配套配置也簡單低低偏個人使用或需要簡單管理界面的小團(tuán)隊(duì)我選vsftpd的理由很直接第一它是很多常用發(fā)行版默認(rèn)就帶的服務(wù)端離線包里最好找第二全部配置集中在一個文件里出錯容易定位第三SELinux對vsftpd有現(xiàn)成的布爾值開關(guān)放行時不用瞎折騰第四資源占用真的低一臺低配虛擬機(jī)跑它毫無壓力。后面所有實(shí)操都基于vsftpd展開選型上如果你沒有特殊需求跟這個走就行。2. 離線安裝包怎么準(zhǔn)備——這是最容易被卡住的一步2.1 用包管理工具在有網(wǎng)機(jī)器上拉包而不是亂找“綠色版”離線安裝的第一步是找一臺和目標(biāo)任務(wù)機(jī)器同發(fā)行版、同大版本、同CPU架構(gòu)的“有網(wǎng)機(jī)器”用它的包管理工具把vsftpd以及所有依賴項(xiàng)下載下來。RPM系的操作是這樣# 先裝 yum-utils里面帶 yumdownloader 工具 yum install -y yum-utils mkdir -p /tmp/ftp_pkgs cd /tmp/ftp_pkgs # --resolve 會自動把依賴包一起拉下來 yumdownloader --resolve --destdir. vsftpd這里有兩個關(guān)鍵點(diǎn)。第一--resolve是按當(dāng)前這臺機(jī)器的依賴關(guān)系去解析的所以準(zhǔn)備包的機(jī)器和目標(biāo)機(jī)系統(tǒng)版本不能差太遠(yuǎn)否則解析出來的依賴版本對不上拷過去裝的時候會報依賴沖突。第二--destdir指定下載目錄把vsftpd和它的一堆依賴都放到同一個目錄里后面好一起拷走。Debian系的操作思路一樣命令不同cd /tmp/ftp_pkgs # 只下載不安裝 apt-get download vsftpd # 收集依賴列表 apt-rdepends vsftpd # 如果只是臨時下載也可以這樣包會緩存到 /var/cache/apt/archives apt-get install --download-only vsftpd我個人的經(jīng)驗(yàn)是RPM系用yumdownloader --resolve最省心依賴一次到位Debian系直接在有網(wǎng)的目標(biāo)同版本機(jī)器上執(zhí)行一次apt-get install --download-only把緩存目錄里的deb包全部拷走基本就能覆蓋依賴。2.2 離線安裝包到底去哪下——幾個可靠渠道在準(zhǔn)備包的時候很多人會習(xí)慣性去搜索引擎找下載鏈接這其實(shí)是下策。離線包的正確獲取渠道按優(yōu)先級排是這些發(fā)行版官方軟件源站點(diǎn)。每個發(fā)行版都有自己的軟件源倉庫瀏覽器打開后按架構(gòu)、組件、版本一層層點(diǎn)進(jìn)目錄能找到打包好的rpm或deb文件。這種渠道的包經(jīng)過官方構(gòu)建和簽名路徑規(guī)范不會出現(xiàn)從第三方網(wǎng)站下載到被篡改包的風(fēng)險。內(nèi)網(wǎng)已有的鏡像源。不少單位內(nèi)部有yum或apt鏡像站這種情況最省事直接把/etc/yum.repos.d里的地址指向內(nèi)網(wǎng)源離線機(jī)器秒變“在線”依賴全部自動解決。系統(tǒng)安裝ISO。你的U盤里如果有同版本的系統(tǒng)安裝鏡像掛載ISO里面自帶一個完整的軟件包倉庫。很多服務(wù)版ISO里能找到vsftpd包掛載之后直接用ISO當(dāng)本地源安裝這是一個經(jīng)常被忽略的路子。軟件官方源碼發(fā)布頁。拿不到二進(jìn)制包的時候可以下載vsftpd源碼tar包目標(biāo)機(jī)上用gcc編譯安裝。這個坑比較多目標(biāo)機(jī)得提前裝好編譯工具鏈和openssl開發(fā)頭文件我一般只把它作為最后手段。2.3 包到手上之后校驗(yàn)、拷貝、做本地軟件源下載下來的包不能直接用先做完整性校驗(yàn)# 官網(wǎng)或源站會給每個文件發(fā)布SHA256值 sha256sum vsftpd-*.rpm校驗(yàn)值對得上再拷??截惙绞缴蟄盤或移動硬盤最直接如果內(nèi)網(wǎng)里有跳板機(jī)且目標(biāo)機(jī)開著sshd用scp傳也行。注意一個邏輯問題你搭FTP之前可能沒有其他文件傳輸通道所以第一次進(jìn)服務(wù)器的文件傳輸基本靠物理介質(zhì)不要慌這是正常流程。包拷進(jìn)目標(biāo)機(jī)之后強(qiáng)烈建議做一步用createrepo把目錄變成本地軟件源。這樣之后就能用yum正常安裝依賴自動處理比手動rpm -ivh一個個按順序裝要省心得多# 在目標(biāo)機(jī)上的包目錄里執(zhí)行 cd /tmp/ftp_pkgs createrepo . # 寫一個repo文件 /etc/yum.repos.d/local-ftp.repo [local-ftp] nameLocal FTP Repo baseurlfile:///tmp/ftp_pkgs enabled1 gpgcheck0 # 然后就像在線環(huán)境一樣安裝 yum install -y vsftpd重要提醒如果你用ISO做倉庫repo文件里的baseurl要寫file:///mnt/cdrom并且先把ISO掛載到/mnt/cdrom。Debian系如果沒有本地源條件就用dpkg -i安裝缺依賴再單獨(dú)下載補(bǔ)齊順序通常是先裝依賴再裝主包。3. 安裝和核心配置——配置項(xiàng)看懂了再動手3.1 安裝后的初始檢查和啟動包裝好之后第一件事是確認(rèn)服務(wù)能不能起來、端口有沒有監(jiān)聽systemctl enable --now vsftpd ss -tlnp | grep :21如果能看到*:21的LISTEN狀態(tài)說明服務(wù)已經(jīng)起來了。這時候且慢高興默認(rèn)配置下大概率只能匿名訪問離“能正常使用”還有一段距離。下一步要改配置。3.2 vsftpd.conf核心配置項(xiàng)逐條拆解vsftpd的配置集中在/etc/vsftpd/vsftpd.conf一個文件里注釋寫得還算清楚但很多人喜歡直接抄網(wǎng)上的配置出了問題就抓瞎。下面這份是我在離線內(nèi)網(wǎng)場景下常用的配置每一條都標(biāo)了為什么這么寫# 關(guān)閉匿名訪問內(nèi)部使用場景不需要匿名 anonymous_enableNO # 允許本地用戶登錄 local_enableYES # 開啟寫權(quán)限包括上傳、刪除、重命名等寫操作 write_enableYES # 上傳文件的權(quán)限掩碼022 表示文件644、目錄755 local_umask022 # 進(jìn)入目錄時顯示目錄說明文件 dirmessage_enableYES # 開啟傳輸日志 xferlog_enableYES xferlog_std_formatYES # 主動模式數(shù)據(jù)連接使用20號端口 connect_from_port_20YES # 以獨(dú)立服務(wù)方式監(jiān)聽而不是走xinetd listenYES listen_ipv6NO # 指定PAM認(rèn)證方式 pam_service_namevsftpd # 用戶白名單機(jī)制user_list 里列出的用戶才允許登錄 userlist_enableYES userlist_file/etc/vsftpd/user_list userlist_denyNO # 所有本地用戶chroot到自己的家目錄 chroot_local_userYES chroot_list_enableYES chroot_list_file/etc/vsftpd/chroot_list # 家目錄可寫時允許chroot訪問有風(fēng)險見下文說明 allow_writeable_chrootYES # 被動模式端口段 pasv_enableYES pasv_min_port30000 pasv_max_port31000逐個說幾個關(guān)鍵點(diǎn)。write_enableYES控制的是整個FTP會話能不能執(zhí)行寫相關(guān)的命令。如果這個不開哪怕目錄權(quán)限給得再足客戶端上傳也會收到550錯誤而且提示不明確容易誤判為目錄權(quán)限問題。所以只要業(yè)務(wù)需要上傳這個必須開。chroot_local_userYES把每個本地用戶限制在自己的家目錄里用戶登錄后ls /看到的就是家目錄不會跑到系統(tǒng)其他路徑瞎逛。chroot_list_enableYES配合chroot_list_file的意思是在chroot_list文件里列出的用戶不受chroot限制。注意這個邏輯是“名單里的人不限制”和直覺相反容易搞混。allow_writeable_chrootYES這條要單獨(dú)說。vsftpd出于安全考慮默認(rèn)如果用戶的chroot目錄也就是家目錄對用戶可寫它會拒絕在這個chroot內(nèi)提供寫服務(wù)日志里報500 OOPS: refusing to run with writable root inside chroot()。很多人遇到這個錯誤就加allow_writeable_chrootYES加完確實(shí)不報錯了但代價是取消了vsftpd對這個風(fēng)險點(diǎn)的保護(hù)。我自己的做法是盡量把用戶家目錄的屬主改成root、權(quán)限改成755然后在里面建一個可寫的upload子目錄既滿足上傳需求又不用打開這個開關(guān)。被動模式那三個參數(shù)值得單獨(dú)拎出來講。3.3 主動模式與被動模式——為什么連不上多數(shù)是這里FTP和普通HTTP不一樣它有兩個連接21端口是控制連接數(shù)據(jù)連接是另外建立的。主動模式PORT下服務(wù)器主動去連客戶端的20端口被動模式PASV下服務(wù)器開一個高位端口等著客戶端來連。用生活化的比喻主動模式像你給商家留了個座機(jī)號商家主動打電話給你報商品清單被動模式像商家給你報了一串分機(jī)號你自己撥過去聽清單。現(xiàn)在絕大多數(shù)客戶端環(huán)境都在NAT后面客戶端根本沒有公網(wǎng)端口能讓服務(wù)器主動來連所以被動模式是絕對主流。配置里的pasv_min_port30000和pasv_max_port31000就是給被動模式準(zhǔn)備的端口段。端口段的選擇標(biāo)準(zhǔn)是太小并發(fā)連接會沖突太大防火墻策略難寫。1000個端口對一個小團(tuán)隊(duì)或十來臺對接設(shè)備完全夠用。如果服務(wù)器本身也在NAT后面還要加一行pasv_address服務(wù)器對外的地址否則客戶端拿到的是內(nèi)網(wǎng)地址連不過來。這一條我踩過不止一次坑后面排查部分會詳細(xì)說。4. 用戶與權(quán)限——按最小權(quán)限原則開賬號4.1 本地賬號方案每個業(yè)務(wù)一個nologin用戶離線內(nèi)網(wǎng)場景我一般不給FTP開匿名訪問而是按業(yè)務(wù)開系統(tǒng)賬號每個人一個專屬目錄# 創(chuàng)建FTP專用用戶shell設(shè)為nologin禁止登錄系統(tǒng) useradd -d /data/ftp/ftpuser1 -s /sbin/nologin ftpuser1 # 家目錄由root持有普通用戶只讀 mkdir -p /data/ftp/ftpuser1 chown root:root /data/ftp/ftpuser1 chmod 755 /data/ftp/ftpuser1 # 上傳目錄給用戶自己可寫 mkdir -p /data/ftp/ftpuser1/upload chown ftpuser1:ftpuser1 /data/ftp/ftpuser1/upload chmod 755 /data/ftp/ftpuser1/upload # 設(shè)置密碼 passwd ftpuser1/sbin/nologin這個設(shè)置很重要FTP只需要這個賬號的文件讀寫能力不需要它登錄系統(tǒng)把shell設(shè)成nologin就從源頭上封死了SSH登錄的可能。另一個容易忽略的點(diǎn)是/sbin/nologin必須寫進(jìn)/etc/shells否則PAM認(rèn)證會拒絕這個用戶登錄時報530。多數(shù)發(fā)行版默認(rèn)已經(jīng)有沒有的話手動加一行。家目錄屬主設(shè)為root、755再單獨(dú)建一個upload子目錄給用戶寫這套組合拳既滿足了上傳需求又避免了chroot內(nèi)可寫目錄的安全告警還順手把“用戶只能看到自己想讓他看到的東西”這件事做了。4.2 虛擬用戶方案不建系統(tǒng)賬號用數(shù)據(jù)庫認(rèn)證如果你不想為每個FTP用戶都創(chuàng)建一個系統(tǒng)賬號vsftpd還支持虛擬用戶方案。虛擬用戶不是真實(shí)系統(tǒng)用戶它統(tǒng)一映射到一個系統(tǒng)賬號上但每個虛擬用戶可以單獨(dú)指定目錄、權(quán)限、設(shè)置。我維護(hù)起來反而更清爽因?yàn)橄到y(tǒng)賬號不會越積越多。操作分四步。第一步建一個映射用的系統(tǒng)賬號useradd -d /data/ftpv -s /sbin/nologin ftpvuser第二步寫虛擬用戶賬號密碼文件格式是奇數(shù)行用戶名、偶數(shù)行密碼cat /etc/vsftpd/virtual_users EOF user1 passwd1 user2 passwd2 EOF第三步把文本文件轉(zhuǎn)成hash數(shù)據(jù)庫db_load -T -t hash -f /etc/vsftpd/virtual_users /etc/vsftpd/virtual_users.db第四步改PAM認(rèn)證配置/etc/pam.d/vsftpd改成auth required pam_userdb.so db/etc/vsftpd/virtual_users account required pam_userdb.so db/etc/vsftpd/virtual_users然后在vsftpd.conf里加上guest_enableYES guest_usernameftpvuser virtual_use_local_privsYES這樣虛擬用戶登錄后就會以ftpvuser的身份干活。每個虛擬用戶還能單獨(dú)定義家目錄在/etc/vsftpd/user_conf/目錄下建一個和用戶名同名的文件內(nèi)容寫local_root/data/ftp/user1這樣賬號和目錄的對應(yīng)關(guān)系就完全由你控制了。4.3 上傳權(quán)限與umask的細(xì)節(jié)上傳文件的權(quán)限是由local_umask決定的。022是常見選擇上傳的文件是644、目錄是755其他人可以讀但不能寫。如果目錄里有敏感數(shù)據(jù)不想讓其他同組用戶看到把local_umask改成027文件就變成640。這個值直接影響了多方對接時別人能不能讀到你的轉(zhuǎn)運(yùn)文件建議在項(xiàng)目開始時就跟業(yè)務(wù)方確認(rèn)好。還有個容易忽略的點(diǎn)write_enableYES是全局的你沒辦法在配置里單獨(dú)給某個目錄開寫權(quán)限。目錄能不能寫完全靠文件系統(tǒng)權(quán)限控制。所以權(quán)限設(shè)計的核心思路是全局開關(guān)開到位細(xì)粒度控制交給目錄屬主和權(quán)限位。5. 防火墻、SELinux與開機(jī)自啟——裝完不代表能用5.1 防火墻放行除了21別忘了被動端口段很多人在本機(jī)測試FTP一切正常換臺機(jī)器一連就超時問題基本出在防火墻。如果用的是firewalld# 放行21端口的標(biāo)準(zhǔn)FTP服務(wù) firewall-cmd --permanent --add-serviceftp # 放行被動模式端口段 firewall-cmd --permanent --add-port30000-31000/tcp # 重載生效 firewall-cmd --reload如果用的是iptables就加兩條規(guī)則iptables -A INPUT -p tcp --dport 21 -j ACCEPT iptables -A INPUT -p tcp --dport 30000:31000 -j ACCEPT被動模式端口段是最容易被漏掉的部分。很多運(yùn)維開了21就以為夠了結(jié)果客戶端能登錄但一列目錄就卡住因?yàn)閿?shù)據(jù)連接建立不了。另外要提醒的是如果服務(wù)器前面還有硬件防火墻或云安全組記得把端口段一起加進(jìn)去別只在服務(wù)器本機(jī)放行。5.2 SELinux不要一把梭關(guān)掉開對應(yīng)布爾值就行SELinux是離線內(nèi)網(wǎng)機(jī)器上另一個“裝完連不上”的大戶?,F(xiàn)象往往是服務(wù)起來了、防火墻也放行了但客戶端登錄時報500 OOPS: cannot change directory:/home/xxx或者連接后行為異常。很多人的第一反應(yīng)是setenforce 0直接關(guān)掉我強(qiáng)烈不建議這么干。內(nèi)網(wǎng)環(huán)境同樣需要縱深防御SELinux作為一種強(qiáng)制訪問控制機(jī)制對上線的服務(wù)器是有實(shí)際價值的。正確的做法是先看審計日志grep vsftpd /var/log/audit/audit.log | grep denied確認(rèn)是SELinux攔截之后有針對地放行# 允許FTP完全訪問包括讀寫家目錄之外的文件 setsebool -P ftpd_full_access on # 如果只是需要匿名寫或特定目錄用更細(xì)的布爾值 setsebool -P ftpd_anon_write on # 給FTP專用目錄打標(biāo)簽 semanage fcontext -a -t public_content_t /data/ftp(/.*)? restorecon -R -v /data/ftpsemanage命令如果不存在先裝policycoreutils-python-utils這個包。用-P參數(shù)是為了讓布爾值持久化重啟不丟失。5.3 systemd服務(wù)管理的基本操作vsftpd在現(xiàn)代發(fā)行版里以獨(dú)立守護(hù)進(jìn)程方式運(yùn)行服務(wù)管理就三句話systemctl enable vsftpd # 開機(jī)自啟 systemctl restart vsftpd # 改完配置重啟生效 systemctl status vsftpd # 看運(yùn)行狀態(tài)排查問題時日志是第一個要去看的地方j(luò)ournalctl -u vsftpd -n 50 tail -f /var/log/xferlog # 傳輸日志 tail -f /var/log/vsftpd.log # 調(diào)試日志需要開啟vsftpd.conf里如果沒開log_ftp_protocolYESvsftpd.log是空的需要排問題時臨時把它打開能記錄完整的FTP命令交互過程定位問題非常有效。排完再關(guān)掉避免日志膨脹。6. 常見問題與排查實(shí)錄——照著這張表能省兩小時6.1 排查速查表以下是我在多次離線部署中遇到的典型問題和解決方案整理成表建議收藏現(xiàn)象可能原因排查與解決連接直接被拒服務(wù)沒起、防火墻攔截先ss -tlnp登錄后列目錄卡死被動模式端口未放行、NAT環(huán)境缺pasv_address放行30000-31000端口段服務(wù)端在NAT后配置pasv_address530 Login incorrect用戶不存在、密碼錯、user_list白名單限制、shell不在/etc/shells逐項(xiàng)排查重點(diǎn)確認(rèn)shell和pam認(rèn)證方式500 OOPS: cannot change directorySELinux攔截、目錄不存在或?qū)僦鞑粚碼udit.log確認(rèn)restorecon目錄標(biāo)簽檢查目錄權(quán)限500 OOPS: writable root inside chroot家目錄對用戶可寫家目錄屬主改root、755或確認(rèn)風(fēng)險后加allow_writeable_chrootYES553 Could not create file目錄無寫權(quán)限、磁盤滿檢查upload目錄屬主和權(quán)限df -h看磁盤傳輸速度很慢客戶端被動模式連到服務(wù)器I/O瓶頸看xferlog判斷瓶頸檢查服務(wù)端網(wǎng)卡和磁盤負(fù)載6.2 實(shí)錄一被動模式端口段沒放行有一次部署完成后本地用命令行ftp連上去登錄成功輸入ls就卡住直到超時。當(dāng)時服務(wù)端防火墻、SELinux都檢查過看似沒問題最后發(fā)現(xiàn)是前置防火墻要單獨(dú)放行被動端口段服務(wù)器本機(jī)放行還不夠。排查思路是先在服務(wù)器本機(jī)用ftp客戶端連一次如果本機(jī)正常、跨機(jī)異常基本可以判定問題出在網(wǎng)絡(luò)路徑上的某個過濾設(shè)備。再在服務(wù)器上臨時開log_ftp_protocolYES會看到客戶端發(fā)來PASV命令服務(wù)器回了227 Entering Passive Mode (10,0,0,1,117,45)這個地址和端口就是客戶端要去連的如果連不通問題就出在地址或端口被攔。這里還有個細(xì)節(jié)227里的四個數(shù)是被動模式IP地址后兩個數(shù)是被動端口。117*25645等于30000左右的端口正好落在我們配置的端口段內(nèi)。如果發(fā)現(xiàn)返回的IP是內(nèi)網(wǎng)地址而客戶端在別的網(wǎng)段就要配置pasv_address指向服務(wù)端的對外地址。6.3 實(shí)錄二SELinux攔截導(dǎo)致的目錄切換失敗另一個項(xiàng)目里用戶登錄正常但訪問家目錄時報500 OOPS: cannot change directory:/data/ftp/ftpuser1。第一反應(yīng)是目錄權(quán)限問題查了權(quán)限完全正常直到看了audit.log才發(fā)現(xiàn)是SELinux在攔截。解決辦法就是上一節(jié)說的先semanage fcontext給FTP目錄打上public_content_t標(biāo)簽再restorecon生效。如果你不想記這些命令setsebool -P ftpd_full_access on也能解決問題但屬于“一把梭”把SELinux對FTP的所有限制全放開了。我個人的習(xí)慣是能精細(xì)到目錄標(biāo)簽就盡量精細(xì)畢竟多一層控制多一層安全。6.4 實(shí)錄三530 Login incorrect的隱藏原因還有一次用戶報登錄總是530密碼確認(rèn)沒錯。查了一圈發(fā)現(xiàn)問題出在用戶的shell被改成了nologin之后PAM模塊檢查/etc/shells發(fā)現(xiàn)里面沒有/sbin/nologin直接拒絕認(rèn)證。往/etc/shells里加上這一行就解決了。所以排查530的順序應(yīng)該是用戶是否存在、shell是否在/etc/shells里、密碼是否正確、user_list是否限制、PAM配置是否被改過。按這個順序走一遍基本能解決九成登錄問題。7. 上線前的安全加固和運(yùn)維建議7.1 FTP是明文協(xié)議至少要給它加一層TLSFTP的賬號密碼和數(shù)據(jù)傳輸都是明文在同網(wǎng)段里用抓包工具就能直接看到密碼。內(nèi)網(wǎng)不代表絕對安全這一點(diǎn)必須說明白。如果你的對接方客戶端支持FTPS建議開啟TLS。vsftpd開啟TLS的配置比較簡單ssl_enableYES allow_anon_sslNO force_local_data_sslYES force_local_logins_sslYES rsa_cert_file/etc/ssl/certs/vsftpd.pem rsa_private_key_file/etc/ssl/private/vsftpd.key證書用openssl自簽一個就夠openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \ -keyout /etc/ssl/private/vsftpd.key \ -out /etc/ssl/certs/vsftpd.pem自簽證書客戶端首次連接會提示證書不受信任正?,F(xiàn)象內(nèi)部使用可以接受。另外要提醒的是開啟TLS后老的客戶端如果只支持明文FTP就連接不上了切TLS前要確認(rèn)對接方客戶端的兼容性。7.2 日志、限速和防爆破上線前至少把三件事做了一是確認(rèn)傳輸日志打開/etc/vsftpd/vsftpd.conf里有xferlog_enableYES這樣每次傳輸都有記錄出問題能追溯到人二是本地賬號按業(yè)務(wù)最小化分配能用虛擬用戶管理的就不要開系統(tǒng)賬號三是如果服務(wù)暴露在比較惡劣的網(wǎng)絡(luò)環(huán)境里配合fail2ban類工具監(jiān)控登錄失敗連續(xù)失敗自動封禁來源IP。常見的vsftpd fail2ban配置不難關(guān)鍵是找到日志路徑讓它監(jiān)控vsftpd的登錄失敗記錄。這塊我建議不要跳過內(nèi)網(wǎng)掃描和爆破腳本其實(shí)也很常見遇到過幾次之后你就知道這步不能省。7.3 把這套流程固化下來離線部署FTP這件事做一次可能覺得繁瑣但你把它拆解成固定流程之后復(fù)用成本很低。我現(xiàn)在每個項(xiàng)目都按統(tǒng)一清單走有網(wǎng)機(jī)器上同版本拉包、校驗(yàn)、createrepo、本地源安裝、防火墻放行21和被動端口段、SELinux布爾值或目錄標(biāo)簽、本機(jī)先連一次、再用對端驗(yàn)證一遍傳輸。走完這套流程半小時內(nèi)肯定收工而且基本不會翻車。我個人在實(shí)際操作中的體會是離線環(huán)境部署最忌諱“裝完就跑”。服務(wù)能用只是及格線配置項(xiàng)背后的安全含義、日志怎么看、出問題從哪查起這些才是真正決定你后續(xù)運(yùn)維省不省心的關(guān)鍵。照這篇文章的思路搭一次后續(xù)再遇到類似需求你會感謝當(dāng)初把這些坑都踩過一遍的自己。