Sharing

2012年10月24日 星期三

vsftp server with virtual account


第一次架 ftp server 就看這兩篇, 很快就可以架好
https://help.ubuntu.com/12.04/serverguide/ftp-server.html
http://manpages.ubuntu.com/manpages/precise/en/man5/vsftpd.conf.5.html

如果想要用 virtual user 來搭配 ftp server, 而不是用 server 上的帳號, 那就看這篇

http://sigerr.org/linux/setup-vsftpd-custom-multiple-directories-users-accounts-ubuntu-step-by-step

Package Installation

總共要裝三個東西, 一個是 vsftpd, 一個是 PAM Pluggable Authentication Modules), 用來建立虛擬帳號以及認証, 最後是 apache 裡的一個小工具, 在建立帳號時會使用到
root@ubuntu:~$ apt-get install vsftpd libpam-pwdfile apache2-utils

Configuration

/etc/pam.d/vsftpd-virtual

建立一個認証的機制, 我們將密碼存在 /nfsroot/ftp/ftpd.passwd 之中
# Customized login using htpasswd file
auth required pam_pwdfile.so pwdfile /nfsroot/ftp/ftpd.passwd
account required pam_permit.so

/etc/vsftpd.conf

前面幾項都是原來的設定檔有的, 我就沒有拿掉, 因為我只是要開放一個 ftp 站供人下載東西, 而不支援上傳, 所以我沒有把 write_enable 打開.
listen=YES
# 改成 NO
anonymous_enable=NO
# 改成 YES
local_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
# 改成 YES
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
# 使用另一個 PAM 設定檔
pam_service_name=vsftpd-virtual
rsa_cert_file=/etc/ssl/private/vsftpd.pem
# 讓所有的虛擬帳號都改用 guest 登入
guest_enable=YES
# 讓所有的虛擬帳號都有各自的目錄, 互相不影響
user_sub_token=$USER
local_root=/nfsroot/ftp/$USER
# 讓檔案擁有者顯示成 ftp
hide_ids=YES
# 使用目錄設定的權限
virtual_use_local_privs=YES

Register User

以下是創造虛擬帳號的方法, 因為在 vsftp.conf 之中我們把 local_root 設定在 /nfsroot/ftp/$USER, 所以我們要主動幫他把目錄建出來, 擁有者改成 ftp, 因為預設的 guest 帳號是 ftp, 權限要改成不能寫入, 不然會無法登入
root@ubuntu:~$ touch /nfsroot/ftp/ftpd.passwd
root@ubuntu:~$ htpasswd -bd /nfsroot/ftp/ftpd.passwd <username> <password>
root@ubuntu:~$ mkdir /nfsroot/ftp/<username>
root@ubuntu:~$ chown ftp:nogroup /nfsroot/ftp/<username>
root@ubuntu:~$ chmod -w /nfsroot/ftp/<username>

以上都做完之後, 就記得要重啟 vsftpd, 就完成囉~

其它雷同的介紹, 但有不同的設定, 可以看看

http://www.onaxer.com/2010/12/01/virtual-users-and-directories-in-vsftpd/
http://howto.gumph.org/content/setup-virtual-users-and-directories-in-vsftpd/




2012/11/13 補充:

Writable Root Folder

如果虛擬帳號的 root folder 不是唯讀的, 就無法登入, 你會看到以下的訊息

500 OOPS: vsftpd: refusing to run with writable root inside chroot()

後來在網路上找了一些文章, 才發現原來這是 vsftpd 2.3.5 才出現的設計,
原來是沒有這個限制的, 也很多人抱怨這個功能很難用, 必須要多建立一個可寫入的子目錄,
才能讓使用者上傳檔案到 ftp server, 所以就有一些解法
http://www.benscobie.com/fixing-500-oops-vsftpd-refusing-to-run-with-writable-root-inside-chroot/#comment-2051

解法1:升級到 vsftpd 3.0.0, 設定檔內加上 allow_writeable_chroot=YES

解法2:改成使用 vsftpd 2.3.2

解法3:修改 2.3.5 的 code, 把這個限制解除掉, 網路上有人已經做了這件事

root@ubuntu:~$ apt-get install python-software-properties
root@ubuntu:~$ add-apt-repository ppa:thefrontiergroup/vsftpd
root@ubuntu:~$ apt-get update
root@ubuntu:~$ apt-get install vsftpd

以下我採取解法3, 在這種設定下, 如果你想要新增一個 read-only 的帳號, 簡單的作法就是照樣把 root folder 的 write permission 去掉, 如果想要讓使用者可以上傳檔案, root folder 就要記得加上 write permission

/etc/vsftpd.conf

listen=YES
# 改成 NO
anonymous_enable=NO
# 改成 YES
local_enable=YES
# 改成 YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
# 改成 YES
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
# 使用另一個 PAM 設定檔
pam_service_name=vsftpd-virtual
rsa_cert_file=/etc/ssl/private/vsftpd.pem
# 讓所有的虛擬帳號都改用 guest 登入
guest_enable=YES
# 讓所有的虛擬帳號都有各自的目錄, 互相不影響
user_sub_token=$USER
local_root=/nfsroot/ftp/$USER
# 讓檔案擁有者顯示成 ftp
hide_ids=YES
# 使用目錄設定的權限
virtual_use_local_privs=YES
allow_writeable_chroot=YES



沒有留言: