我还不能发布图片,所以我会尽我所能简洁地解释一切。
我有一个可以正常工作的 ProFTPd 安装。现在我尝试通过 postgres 路由身份验证。有一个数据库包含一个 webapp 用户表。理想情况下,这将允许 webapp 用户使用他们的 webapp 凭据登录 FTP。以下是 proftpd.conf 文件中的相关设置:
LoadModule mod_sql.c
LoadModule mod_sql_passwd.c
LoadModule mod_sql_postgres.c
#Begin SQL configuration
#mod_sql_password parameters
SQLPasswordEngine on
SQLPasswordEncoding hex
#mod_sql base configuration
SQLEngine on
SQLBackend postgres
SQLConnectInfo [database_name]@localhost:5432 [SELECT name] [password]
SQLAuthTypes SHA1
SQLAuthenticate users
SQLLogFile /var/log/proftpd/sqlLog.txt
“SELECT name”帐户是被授予了对 webapp users 表的 SELECT 权限的帐户。我可以使用以下命令从命令行登录该用户
psql -d [database_name] -U [SELECT name] -W
然后输入与 proftpd.conf 文件中相同的密码。
当我尝试连接时,它会生成以下日志文件数据:
Feb 21 10:20:00 mod_sql/4.2.5[43238]: entering postgres cmd_exit
Feb 21 10:20:00 mod_sql/4.2.5[43238]: exiting postgres cmd_exit
Feb 21 10:29:45 mod_sql/4.2.5[43334]: defaulting to 'postgres' backend
Feb 21 10:29:45 mod_sql/4.2.5[43334]: backend module 'mod_sql_postgres/4.0.4'
Feb 21 10:29:45 mod_sql/4.2.5[43334]: backend api 'mod_sql_api_v1'
Feb 21 10:29:45 mod_sql/4.2.5[43334]: >>> sql_sess_init
Feb 21 10:29:45 mod_sql/4.2.5[43334]: entering postgres cmd_defineconnection
Feb 21 10:29:45 mod_sql/4.2.5[43334]: name: 'default'
Feb 21 10:29:45 mod_sql/4.2.5[43334]: user: [SELECT account]
Feb 21 10:29:45 mod_sql/4.2.5[43334]: host: 'localhost'
Feb 21 10:29:45 mod_sql/4.2.5[43334]: db: [database_name]
Feb 21 10:29:45 mod_sql/4.2.5[43334]: port: '5432'
Feb 21 10:29:45 mod_sql/4.2.5[43334]: ttl: '0'
Feb 21 10:29:45 mod_sql/4.2.5[43334]: exiting postgres cmd_defineconnection
Feb 21 10:29:45 mod_sql/4.2.5[43334]: mod_sql engine : on
Feb 21 10:29:45 mod_sql/4.2.5[43334]: negative_cache : off
Feb 21 10:29:45 mod_sql/4.2.5[43334]: authenticate : users
Feb 21 10:29:45 mod_sql/4.2.5[43334]: usertable : users
Feb 21 10:29:45 mod_sql/4.2.5[43334]: userid field : userid
Feb 21 10:29:45 mod_sql/4.2.5[43334]: password field : passwd
Feb 21 10:29:45 mod_sql/4.2.5[43334]: UID field : uid
Feb 21 10:29:45 mod_sql/4.2.5[43334]: GID field : gid
Feb 21 10:29:45 mod_sql/4.2.5[43334]: homedir field : homedir
Feb 21 10:29:45 mod_sql/4.2.5[43334]: homedir(default) : [redacted]
Feb 21 10:29:45 mod_sql/4.2.5[43334]: shell field : shell
Feb 21 10:29:45 mod_sql/4.2.5[43334]: SQLMinUserUID : 999
Feb 21 10:29:45 mod_sql/4.2.5[43334]: SQLMinUserGID : 999
Feb 21 10:29:45 mod_sql/4.2.5[43334]: <<< sql_sess_init
Feb 21 10:29:45 mod_sql/4.2.5[43334]: >>> sql_pre_pass
Feb 21 10:29:45 mod_sql/4.2.5[43334]: <<< sql_pre_pass
Feb 21 10:29:45 mod_sql/4.2.5[43334]: >>> cmd_getpwnam
Feb 21 10:29:45 mod_sql/4.2.5[43334]: entering postgres cmd_escapestring
Feb 21 10:29:45 mod_sql/4.2.5[43334]: entering postgres cmd_open
Feb 21 10:29:45 mod_sql/4.2.5[43334]: exiting postgres cmd_open
Feb 21 10:29:45 mod_sql/4.2.5[43334]: exiting postgres cmd_escapestring
Feb 21 10:29:45 mod_sql/4.2.5[43334]: unrecoverable backend error
Feb 21 10:29:45 mod_sql/4.2.5[43334]: error: 'mod_sql_postgres/4.0.4'
Feb 21 10:29:45 mod_sql/4.2.5[43334]: message: 'FATAL: Ident authentication failed for user [SELECT account]
'
Feb 21 10:29:45 mod_sql/4.2.5[43334]: entering postgres cmd_exit
Feb 21 10:29:45 mod_sql/4.2.5[43334]: exiting postgres cmd_exit
所以我现在完全不知所措,因为我不确定为什么在命令行登录中可以使用的相同凭据在 proftpd.conf 中使用时不起作用。有人能给我建议下一步该怎么做吗?谢谢!
答案1
好的,我找到了这个问题的答案,以防将来有人遇到它。
因此,错误日志看起来好像 Postgres 拒绝了我的有效凭据。但事实并非如此!在 proftpd.conf 文件中,proftpd 默认尝试以用户和组“nobody”的身份登录。“nobody”是服务器上实际有效的用户,但关联的 ID# 通常很低。在我的情况下是 99。
现在,使用 mod_sql 时,有一个名为SQLMinID
。默认情况下,该值设置为 999。这就是阻止我登录的原因!
为了解决这个问题,我只需将 proftpd.conf 中的“用户”和“组”参数设置为具有更高 ID 号且具有足够权限访问 postgres 的用户。我这样做后,它就起作用了。