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: 첫 번째는 인증 및 계정/세션 관리를 처리하고 다른 하나는 이름 정보만 제공합니다. 즉, 첫 번째 항목은 읽기/쓰기 작업을 수행할 수 있고 두 번째 항목은 읽기 전용입니다.

사용자의 홈 디렉토리에 대한 경로가 검색 되면 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에 이를 채울 만큼 충분한 데이터가 있는지 확인하세요 :) 또한 nss-mysql 구성 파일은 사용자가 사용할 수 있을 만큼 유연합니다. 기본값 무엇이든.

관련 정보