我已经成功使用 vsftpd 让虚拟用户通过 PAM 连接到我的 mysql DB。现在我想通过成功的 vsftpd 连接自动创建用户目录。
这是 /etc/pam.d/vsftpd 配置:
#%PAM-1.0
session optional pam_keyinit.so force revoke
auth required pam_mysql.so verbose=1 user=root passwd=mypass host=localhost db=mydb table=mytable usercolumn=username passwdcolumn=password crypt=3
account required pam_mysql.so verbose=1 user=root passwd=mypass host=localhost db=mydb table=mytable usercolumn=username passwdcolumn=password crypt=3
session required pam_mkhomedir.so skel=/home/skel/ umask=0022 debug
现在添加 pam_mkhomedir 只会显示它无法创建目录,并且任何日志中都没有其他消息。所以它显然不适用。我还需要什么吗?
我的 /etc/vsftpd/vsftpd.conf:
# No ANONYMOUS users allowed
anonymous_enable=NO
# Allow 'local' users with WRITE permissions (0755)
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=NO
xferlog_enable=YES
connect_from_port_20=YES
# define a unique user on your system which the
# ftp server can use as a totally isolated and unprivileged user.
nopriv_user=vsftpd
chroot_local_user=YES
listen=YES
# here we use the authentication module for vsftpd to check users name and passw
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
userlist_deny=YES
# here the vsftpd will allow the 'vsftpd' user to login into '/home/vsftpd/$USER directory
guest_enable=YES
guest_username=vsftpd
local_root=/home/vsftpd/$USER
user_sub_token=$USER
virtual_use_local_privs=YES
download_enable=NO
force_local_data_ssl=NO
force_local_logins_ssl=NO
# PASV - passive ports for FTP
pasv_enable=YES
pasv_min_port=14000
pasv_max_port=14100
我看到一篇帖子说我的 vsftpd.conf 中需要这个,所以我也尝试了这个:
session_support=YES
但现在它似乎不再进行身份验证,如日志所示:
Mar 24 00:46:16 ip-10-212-239-40 vsftpd[1962]: pam_keyinit(vsftpd:session): Unable to look up user "user1"
Mar 24 00:46:16 ip-10-212-239-40 vsftpd[1962]: pam_mkhomedir(vsftpd:session): User unknown.
即使我已经创建了目录,情况也是如此。现在没有人可以进入。
有任何想法吗?
答案1
简短的回答是您正在混合系统和服务凭证,并且不应该(不能?)在 vsftpd 中将 pam_mkhomedir 与虚拟用户一起使用。
pam_mkhomedir 用于创建用户本地目录,并假定用户已在系统中定义。 vsftpd 中的虚拟用户是不是系统用户(根据设计)因此在 vsftpd 服务之外没有任何权限(系统不知道这些用户)。使用 PAM 进行身份验证只会传递用户凭据的验证(用户名 + 密码 ==> OK)。使用虚拟用户时,这可能会造成混淆,因为 vsftpd 也可以配置为使用 PAM 的系统用户。
当您为虚拟用户,您必须将 vsftpd 服务帐户/组设为文件夹的所有者,并将“虚拟主目录”放置在 vsftpd 服务路径中,并为 vsftpd 服务设置适当的权限。我不确定您要解决什么问题,但是当您对用户会话进行 chroot 时,我假设您正在尝试在用户之间创建一些隔离。既然您必须在用户数据库中创建虚拟用户才能登录,为什么不同时生成主目录呢?我已经使用用户添加/更改/删除脚本完成了此操作,以保持虚拟用户数据库和 vsftpd 用户虚拟主文件夹一致。YMMV。
请记住,使用虚拟用户时,您只能在 vsftpd 内工作,而不是在系统内工作。
答案2
为了使 PAM 模块的用户查找成功,您需要在 中启用 MySQL 的 NSS 模块nsswitch.conf(5)
。nss_mysql
是您的朋友。
答案3
您可以尝试使用pam_script
- 它是一个 pam 模块,允许在打开用户会话后执行任意 shell 脚本(等等)。
您可以pam_script
在这里找到:https://github.com/jeroennijhof/pam_script。它也应该可以通过包管理器安装,至少我可以通过 apt-get 安装它。
请小心,因为 vsftpd 至少在拒绝身份验证时似乎存在 pam_script 的一些问题,请参阅我未解决的问题:pam_script 验证失败后 vsftpd 冻结。不过就你的情况来说这应该不是问题。