糕飛.想點三十而立.努力發奮

2012年6月16日 星期六

vsftpd 的設定

+ 暫沒回應
看了不少文章,終於弄妥了 Ubuntu 12.04 64bits 中設定 vsftpd 。因為不想為每一個 ftp users 開 local account,打算用 virtual users 作 download 之用 (Upload 則用 sftp)。網上有很多教學文章,但參考完後還是不得要領,最後花了不少時間 trials and errors 才弄妥。特此記下以作筆記。

以下內容主要是參考這個這個的。
  1. 安裝 vsftpd
    sudo install vsftpd
  2. 建立一個新 User,所有 vritual users 會以此 users 作登入
    # Don't use -m (--create-home) option. This avoids creating a home
    # directory based on /etc/skel (.bash* and .profile files).
    sudo useradd -d /home/work workers
    sudo mkdir /home/work
    sudo chown workers /home/work
  3. 建立 virutal users 的 config directory
    sudo mkdir /etc/vsftpd
    
    sudo mkdir /etc/vsftpd/vusers
  4. 開以修改 vsftpd 的設定。修改 /etc/vsftpd.conf 文件
    sudo vi /etc/vsftpd.conf
  5. 修改以下的設定,如原 file 沒有的便加上去
    # Disable anonymous_enable is optional.
    anonymous_enable=NO
    ...
    local_enable=YES
    ...
    pam_service_name=vsftpd
    # Enable (only) guests.
    guest_enable=YES
    # This is not needed, it's the default. Just here for clarity.
    guest_username=ftp
    # Where the guests (virtual) usernames are set.
    user_config_dir=/etc/vsftpd/vusers
    
  6. 建立 virtual user 的設定,為方便管理,會將各 users 的設定以 symbolic link 的形式連結到一共同的檔案上。建立設定檔。
    sudo vi /etc/vsftpd/workers
  7. 輸入以下內容
    write_enable=YES
    
    anon_mkdir_write_enable=YES
    
    anon_other_write_enable=YES
    
    anon_upload_enable=YES
    
    local_root=/home/work
    
    chroot_local_user=YES
    
    dirlist_enable=YES
    
    download_enable=YES
    
    guest_username=workers
  8. 為每個 virtual users 建立 symbolic link,如有 mike 和 sarah,則
    sudo ln -s /etc/vsftpd/workers /etc/vsftpd/vusers/mike
    sudo ln -s /etc/vsftpd/workers /etc/vsftpd/vusers/sarah
  9. 我們用 PAM 來儲存 virtual users 的密碼,所以要修改 /etc/pam.d/vsftpd
    sudo vi /etc/pam.d/vsftpd
  10. 將裏面的 code 改成
    @include common-session
    auth    required pam_pwdfile.so pwdfile /etc/vsftpd/passwd
    account required pam_permit.so
    其他的可以 comment 掉。
    (這個 file 花了我很多時間,試過跟著別人的 config 來設定 Server 會直接 close connection,看 syslog 說 vsftpd segfault,丈八金鋼摸不著頭腦。還以為要用 32 bits library,安裝後還是一樣,最後發覺 @include common-session 不能 comment 掉!)
  11. 為 virtual users 建立密碼
    perl -e '$salt=q($1$).int(rand(1e8)); print "password: "; chomp($passwd=<STDIN>); print crypt($passwd,$salt),"n"'
    

    執行後複製密碼
    (用 pam_pwdfile 要用以上方式產生密碼,用 htpasswd generate 出來的不行,又費了我幾天時間!)
  12. 將複製了的密碼貼上 /etc/vsftpd/passwd 的檔案裏,一行為一個 user,用以下的格式
    username1:password1
    username2:password2
  13. 重啟 vsftpd
    sudo service vsftpd restart
  14. 用 ftp client 試試看吧。

Troubleshoot:
  • 如出現 server closed the connection ,可能是 /etc/pam.d/vsftpd 出現問題。
  • 如出現 500 OOPS: vsftpd: refusing to run with writable root inside chroot() ,則是沒有在 /etc/vsftpd/vusers/ 下建立 user 的設定檔。
  • 如出現 login incorrect 錯誤,則是 passwd 檔錯誤。記緊若用 pam_pwdfile 的話不要用 htpasswd 來建立密碼,要用上面的 script 呀!