次の手順に従ってvsftpdをインストールしました。
http://www.camcloud.com/blog/setup-vsftpd-with-virtual-users-using-mysql
ユーザーがFTPサーバーにログインするたびに、自動/動的にディレクトリを作成しようとします。
私は/etc/pam.d/vsftpd
以下を持っています確かに自動的にディレクトリを作成します。
静的ディレクトリ構成コード
session optional pam_keyinit.so force revoke
auth required pam_mysql.so verbose=1 user=mydbusername passwd=mydbpass host=localhost db=mydb table=mydb_table usercolumn=username passwdcolumn=password crypt=0
account required pam_mysql.so verbose=1 user=mydbusername passwd=mydbpass host=localhost db=mydb table=mydb_table usercolumn=username passwdcolumn=password crypt=0
私の質問はそれを正しく使用する方法ですpam_mkhomedirmysqlユーザー名を使用してディレクトリを作成します。この記事が見つかりましたhttps://www.dalemacartney.com/2012/07/30/auto-creation-of-user-home-directories-in-linux/
これが正しい構成であるかどうかを知り、ディレクトリのユーザー名を設定する方法も知りたいです。コードのどこにもアプリのユーザー名は表示されません。それとも、後ろから起こるのでしょうか?
動的ディレクトリ構成コード
session optional pam_keyinit.so force revoke
auth required pam_mysql.so verbose=1 user=mydbusername passwd=mydbpass host=localhost db=mydb table=mydb_table usercolumn=username passwdcolumn=password crypt=0
account required pam_mysql.so verbose=1 user=mydbusername passwd=mydbpass host=localhost db=mydb table=mydb_table usercolumn=username passwdcolumn=password crypt=0
session required pam_mkhomedir.so skel=/etc/ftp/ umask=0022
答え1
session required pam_mkhomedir.so skel=/etc/ftp/ umask=0022
ご覧のように、pam_mkhomedir.so
行動会議評価。これは効果があるという意味です後ろにauth
ユーザーが認証されました(施設によって)。これを行うには、次のPAM関連機能を定義します。
PAM_EXTERN
int pam_sm_open_session(pam_handle_t * pamh, int flags,
int argc, const char **argv);
前述したように、この関数はユーザーが認証されたときに呼び出されます。したがって、PAMユーザーハンドルを検索するとき...
/* Determine the user name so we can get the home directory */
retval = pam_get_item(pamh, PAM_USER, (const void **)&user);
...名前にアクセスできます検証済み、既存のユーザー。この情報を使用すると、モジュールは必要なもの(ホームディレクトリパス)を簡単な方法で取得できます。getpwnam(3)
図書館の電話番号:
/* Get the password entry */
pwd = getpwnam(user);
これにより、ユーザーに関する情報が入力され、次の構造が返されます。
struct passwd {
char *pw_name; /* username */
char *pw_passwd; /* user password */
uid_t pw_uid; /* user ID */
gid_t pw_gid; /* group ID */
char *pw_gecos; /* user information */
char *pw_dir; /* home directory */
char *pw_shell; /* shell program */
};
さて、この情報がどこから出てくるのか疑問に思うなら、それをチェックしてください。/etc/nsswitch.conf
。これネームサービススイッチ(NSS)はここに情報を提供します。名前通常(ユーザー名、エイリアス、グループ、ホストかもしれません...参照)nsswitch.conf(5)
詳細は)。フォローしているガイドが十分に完璧であれば、PAMを設定できます。そしてNSS:最初は認証とアカウント/セッション管理を処理し、もう1つは名前情報のみを提供します。つまり、最初の項目は読み取り/書き込み操作を実行でき、2番目の項目は読み取り専用です。
ユーザーのホームディレクトリへのパスが検索されたらpam_mkhomedir.so
、存在するかどうかを確認し、存在しない場合は作成するだけです。
/* Stat the home directory, if something exists then we
* assume it is correct and return a success. */
if(stat(pwd->pw_dir, &st) == 0) return PAM_SUCCESS;
return create_homedir(..., pwd, ...);
関数create_homedir
はモジュール自体によって定義されるため、ここに貼り付けるには長すぎます。ただ大きいと思いますmkdir(2)
特定の状況を処理し、すべてがスムーズに進行することを保証する通貨です。詳細についてご質問がある場合は、pam_mkhomedir.so
ソースコードを確認してください。使ったこのバージョン私の答えは(以下で提供しました。ジェイソン・ガンソフ、彼の名前は次にも表示されます。私のpam_mkhomedir.so
マンページ)。
私の考えでは、あなたが従っているガイドが少し不完全なようです。または少なくともMySQLテーブルを作成できます。例:
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(30) | NO | UNI | NULL | |
| pass | varchar(50) | NO | | NULL | |
+----------+-------------+------+-----+---------+----------------+
このテーブルは、VSFTPdが正常に動作するのに十分な詳細があります。ホームルートディレクトリを設定することで、ユーザーのホームディレクトリを簡単に決定できます$ftp_root/username
。これは実際にはlocal_root
パラメータによって設定されます。
local_root=/home/vsftpd/$USER
ただし、pam_mkhomedir.so
VSFTPdではありません。このメカニズムを使用せずにNSS(経由)に依存します。getpwnam(3)
)。問題は、MySQLテーブルがNSSがstruct passwd
以前に見た情報を満たすのに十分な情報を提供しないことです。 NSSがMySQLをソースとして使用するには、次のものをインストールする必要があります。nss-mysql、より大きなMySQLテーブルが必要です。これにはVSFTPd設定を調整する必要がありますが、VSFTPdとnss-mysqlを共存させることに問題はありません。
このディレクトリ最小の nss-mysql 設定の例を示します。 MySQL ユーザーテーブルは次のように定義されます。
+-----------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(255) | NO | | NULL | |
| username_canonical | varchar(255) | NO | UNI | NULL | |
| email | varchar(255) | NO | | NULL | |
| email_canonical | varchar(255) | NO | UNI | NULL | |
| enabled | tinyint(1) | NO | | NULL | |
| salt | varchar(255) | NO | | NULL | |
| password | varchar(255) | NO | | NULL | |
| last_login | datetime | YES | | NULL | |
| locked | tinyint(1) | NO | | NULL | |
| expired | tinyint(1) | NO | | NULL | |
| expires_at | datetime | YES | | NULL | |
| confirmation_token | varchar(255) | YES | | NULL | |
| password_requested_at | datetime | YES | | NULL | |
| roles | longtext | NO | | NULL | |
| credentials_expired | tinyint(1) | NO | | NULL | |
| credentials_expire_at | datetime | YES | | NULL | |
+-----------------------+--------------+------+-----+---------+----------------+
これらのフィールドはすべて必要ないかもしれませんが、struct passwd
以前に見た構造を覚えていて、nss-mysqlにそれを埋めるのに十分なデータがあることを確認してください。)デフォルト値は何でも。