pam_mkhomedirとmysqlを使用してvsftpd用のディレクトリを動的に作成する

pam_mkhomedirとmysqlを使用してvsftpd用のディレクトリを動的に作成する

次の手順に従って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.soVSFTPdではありません。このメカニズムを使用せずに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にそれを埋めるのに十分なデータがあることを確認してください。)デフォルト値は何でも。

関連情報