FTPアクセス用のバーチャルユーザーを作成する

こんにちは、牧野です。
昨日の田村のブログで、2年ほど前に自分が書いたブログ記事を久しぶりに見ました。その記事で触れていたノートPCは今もメインPCとして使っていて、スペック的には特に問題ないのですが、画面の真ん中に何故か縦のラインがずっと表示されていたり、ファンがやたらうるさく回り出す時があったり。。修理に出そうか迷いながらながら使い続けて、かれこれ半年くらいです。。。

さて、今日はFTPサーバーの話題です。vsftpを使ってFTPアクセス用のバーチャルユーザーを作成する方法を紹介します。

今回は、FTPアクセスで使用するLinuxアカウントを一つ用意した上でバーチャルユーザーを作成し、全てのバーチャルユーザーはそのLinuxアカウントの権限でファイル操作を行うことにします。

1.vsftpdの設定
vsftpdのメイン設定ファイルは、/etc や /etc/vsftpd 内にある vsftpd.confです。

今回の認証に関係ある部分を見ていくと、


# Linuxアカウントユーザーでのログインを許可
local_enable=YES
# 書き込みOK
write_enable=YES
# umask
local_umask=022
# ログインしたユーザーを全て「guest」扱いする
guest_enable=YES
# guest扱いされたユーザーがマッピングされるLinuxアカウント
guest_username=linux_account_name
# バーチャルユーザーにローカルユーザーと同様の権限を与える
virtual_use_local_privs=YES

という辺りになります。
認証は後述のPAMで設定することで、特定のバーチャルユーザーアカウントでないとログインできなくなります。

2.PAMの設定
vsftpdのユーザー認証は、PAMを使って行うようになっています。PAMはUnix系のOSで使用されているユーザー認証モジュールで、色んな認証方式のモジュールが提供されています。vsftp等の各ソフトウェアでは、使う認証モジュールを指定すればそのモジュールの認証の仕組みを利用できるので、ソフトウェアの方では各認証方式の処理を作り込まなくても済むようになる、というものです。

vsftpd.confで


pam_service_name=vsftpd

という設定があれば、vsftpdで使用するPAMの設定ファイルは /etc/pam.d/vsftpd になります。(デフォルトのファイル名はftp)
このファイルでLinuxアカウント情報を使って認証するように設定されているのを、別のPAMモジュールを使って認証するように変更します。
バーチャルユーザーの認証のために使えるモジュールは、
pam_userdb
pam_pwdfile
があります。(他にもあるかもしれません。)

■pam_userdbの場合
/etc/pam.d/vsftpd


auth required /lib/security/pam_userdb.so db=/etc/vsftpd
account required /lib/security/pam_userdb.so db=/etc/vsftpd

あとは、アカウント情報を持つ /etc/vsftpd.db ファイルを作成します。


このファイルを作成するために、
(ユーザー1)
(ユーザー1パスワード)
(ユーザー2)
(ユーザー2パスワード)
…

のように、奇数行にユーザー名、偶数行に前のユーザーのパスワードを書いたファイルを用意して、以下のようなコマンドを実行します。


db4.8_load -T -t hash -f user_passwd.txt  /etc/vsftpd.db

このコマンドはDebianの場合で、CentOSでは db_load でした。

■pam_pwdfileの場合
/etc/pam.d/vsftpd


auth    required pam_pwdfile.so pwdfile /etc/vsftpd/passwd
account required pam_permit.so

アカウント情報は、PAMの設定ファイルで指定した /etc/vsftpd/passwd ファイルに記載します。このファイルはベーシック認証のアカウント情報ファイルと同じ形式で作成します。


htpasswd -nb user_name password > /etc/vsftpd/passwd

PAMの設定ができたら、vsftpdを再起動します。

3.その他おまけ
バーチャルユーザー毎に設定を変える時は、user_config_dirを設定します。

/etc/vsftpd.conf


user_config_dir=/path/to/conf_dir

このディレクトリ内にユーザー名のファイルを作成します。ホームディレクトリを変える場合はlocal_rootを使います。
/path/to/conf_dir/username


local_root=/dirname

このように、Linuxユーザーのアカウントは増やさずにFTPだけ使えるアカウントを作成できます。