我们目前有一个用于共享虚拟主机的 LAMP 堆栈,并正在使用 ProFTP。
目前,ProFTP 配置相当固定 - 用户已 chroot 到~
.当前作为默认用户/组运行。我们只使用系统用户 - 没有虚拟用户。
我们使用 SuPHP 以适当的用户/组身份运行每个 PHP 进程。
我真正想要的是让 ProFTP 自动将user:group
上传的文件设置为登录的任何人。因此,如果我以“customer-a”身份登录 FTP,我希望所有上传的文件都归“customer-a”所有。
其主要原因似乎是,如果我现在以某人身份登录,他们无权写入其主目录。我希望 ProFTP 适当地切换用户上下文,而不是放松权限。
可能的解决方案
我考虑过的一件事可能是为每个客户域声明一个虚拟主机,这将允许我配置用户和团体单独的指令。
1)这是一个痛苦的事情,我宁愿避免为每个创建的用户附加配置。 2)ProFTP好像不支持基于名称的虚拟主机。
或者,我可以利用用户所有者和集团所有者指令,并<Directory>
为配置中的每个客户创建一个新块。
我想这样的事情可能会起作用:
<Directory /home/customer-a/>
UserOwner customer-a
UserGroup customer-a
</Directory>
但如果能够以更通用的方式做到这一点,类似于变量%u
,记录下来,那就太好了这里。但我认为这不适用于 UserOwner。
一些细节
- 使用Ubuntu
- ProFTP 1.3.4a
- 阿帕奇2.2
- 将 SuPHP 与 PHP-CGI 结合使用。
答案1
更好的解决方案是使用 MySQL 身份验证,而不是让每个客户都有一个系统帐户。这将为您提供目录位置、用户 ID 方面更大的灵活性,并提高安全性。
为此,请构建具有 mysql 支持的 proftpd。
然后在 mysql 中创建一个表(可能称为“users”):
CREATE TABLE users (
userid VARCHAR(30) NOT NULL UNIQUE,
passwd VARCHAR(80) NOT NULL,
uid INTEGER UNIQUE,
gid INTEGER,
homedir VARCHAR(255),
shell VARCHAR(255),
active BOOLEAN DEFAULT true
);
CREATE INDEX users_userid_idx ON users (userid);
然后添加用户。密码可以采用多种格式(根据 proftpd.conf 中的 SQLAuthTypes 指令),但您应该能够将现有的加密密码放入其中。
INSERT INTO users (username,password, uid, homedir) VALUES ('username','APassWord', 77, '/home/sftpcustomers/custname/')
你的proftpd.conf应该有:
SQLBackend mysql
SQLAuthenticate users
AuthOrder mod_sql.c
SQLAuthTypes OpenSSL Plaintext Crypt
SQLConnectInfo dbname@localhost:3306 db_username db_password
SQLUserInfo users username password uid NULL homedir NULL
SQLUserWhereClause "Active = 1"