FTPアカウントにLDAP
LDAPに対応しているアプリケーションは数多く存在するため、何から紹介すればよいのか迷ってしまうのですが、わかりやすさ、容易に構築できるという点で今回はFTPサーバ+LDAPサーバの組み合わせを紹介してみたいと思います。「えー? 今さらFTPサーバ?」なんて言わないで最後まで読んでみてください(笑)
通常であれば、あるユーザがFTPサービスを利用する場合、そのアカウント情報は/etc/passwdや/etc/shadowに登録されている必要があります。
しかし、ユーザにFTPのみを使用させたい場合、/etc/passwdなどにアカウントが存在してしまうと都合が悪いことがあります。なぜなら/etc/passwdに登録されているユーザ情報はgetpwent(3)などにより、さまざまなアプリケーションから参照されるためです。ldapuserというユーザにはFTPサービスのみ提供したいのに、ldapuser@example.comというメールアドレス宛にメールを送ると/var/mail/ldapuserというメールボックスが作成されては、都合が悪い・・・ですよね。
さて、LDAPサーバ内にFTPアカウントを作成するためには、いくつかの方法が考えられます。1つめの方法はPAMを利用することです。多くの一般的なFTPサーバ、たとえばvsftpdはPAMによる認証に対応しているため、この方法を用いると、特別な設定をすることなくFTPアカウントを使用することができます。
開発者にとってのメリットとしては、ソフトウェアをPAMにさえ対応させれば自動的にLDAP認証(pam_ldap)にも対応できることが挙げられます。一方、認証関連の設定は/etc/ldap.confを用いて行うことになるため、設定の影響範囲が大きいことがデメリットとも言えるでしょう。例えばvsftpdの設定を変更するつもりで/etc/ldap.confを編集しても、その設定がpam_ldapを使用するすべてのソフトウェアに反映されてしまいます。
もう1つの方法は、PAMとは独立してLDAP内にFTP専用のアカウントを作成することです。このようなアカウントを作成しておけば、仮にFTP専用ユーザのユーザ名とパスワードが漏洩してしまっても、その被害の影響範囲はFTPサービスのみに限定されます。アカウント情報を勝手に使われてしまっても用途はFTPに限定されているため、その情報を元にSSHログインできるわけではありません。もちろん開発者は各種LDAP関数を活用してソフトウェアを構成しておく必要があります。Proftpdはこの方式に対応していますが、先ほど例として挙げたvsftpdには、残念ながらこの実装が含まれていません。
それではFTP専用アカウント、ということを前提として、FTP認証用の属性などを設計してみましょう。最低限の情報としては表1のようなものになると思います。
表1 必要な属性
必要な項目 | 必要な理由 | 例 |
ユーザ | 認証に使用するため | ftpuser |
パスワード | 認証に使用するため | ftppass |
ホームディレクトリ | ログイン時のホームディレクトリ | /home/ftproot/ftpuser |
UID番号 | ファイル作成時などに使用される | 10000 |
GID番号 | ファイル作成時などに使用される | 10000 |
グループ名(必要に応じて) | ls-laなどでGID番号だけでなくグループ名が表示されるように | sales |
標準スキーマで用意されている属性を使えば、ftpuserのエントリはリスト1のようになるはずです。
とりあえずは必要な属性のみを列挙してみましたが、すでに皆さんご存じのように、ある属性を使用するにはそれが属するobjectClassを定義する必要があります。上記のFTPグループではcnとgidNumber属性を使用しています。ということで、gidNumberというキーワードを/etc/openldap/schema以下からgrepしてみれば、目的のobjectClassがわかります。
gidNumberが含まれるobjectClassは次のように定義されています。
ということで、cnとgidNumberが含まれている今回のエントリにobjectClass: posixGroupを追加しておくだけで良さそうです。グループではなくユーザ部分はどうなるでしょうか? 今度はuidNumberをキーワードにschemaディレクトリを検索してみます。次のようなエントリが見つかりました。
このposixAccountというobjectClassを使用するためには、先ほど列挙した内容以外にuid属性が必要となります(uid属性がMUSTと定義されているため)。さらに、このobjectClassはtopから派生し、補助オブジェクト(AUXILIARY)であることもわかります。補助オブジェクトとなっているobjectClassは単体で宣言することができません。補助オブジェクトはSTRUCTURALであるaccountなどのobjectClassと一緒に使用する必要があります。
よって、これらをまとめるとリスト2のようなLDIFを作成すれば良いことがわかります。userPassword属性については、例のごとくslappasswdコマンドにて作成された文字列を使用しています。
スキーマファイルの読み方に関しては、今後の連載で紹介していくつもりですので、今回はこのような簡単な説明でお許しください。
FTPサーバの設定
冒頭で述べたよう、FTPサーバを構築するためにはいくつかの選択肢が存在しますが、十分にLDAP認証をサポートしていると言えるのがProftpdです。CentOSではyumコマンドで直接導入することができないため、今回は図1のようにソースファイルからインストールを行いました。
proftpdの設定
ここでは必要最低限の設定のみを行います。
Proftpdはさまざまなオプションを備えていますので、実際のサーバ環境に適用する場合にはそれ以外の項目にも十分注意してください。今回の必要条件としては次の通りです。
- LDAP内のFTPユーザにシェルは必要ないためRequireValidShell offを定義
- LDAPサーバの場所をLDAPServerで定義する
- 検索ベースをdc=example,dc=comとし、検索条件を(&(cn=ユーザ名)(objectClass=posixAccount))とする(そこで見つかったユーザのDNとFTPセッションで入力されたパスワードを元に再度バインドを行い認証する)
- ou=FTPUser,dc=example,dc=comツリー以下よりUID情報の検索を行う
- ou=FTPGroup,dc=example,dc=comツリー以下よりGID情報の検索を行う
設定ファイル中のLDAPDoUIDLookupsとLDAPDoGIDLookupsは必須ではないのですが、このオプションが無い場合にFTPセッション中でls-laなどすると、次のように所有者と所有グループが不明な状態となります。
これでは気持ち悪いので、それぞれのオプションを有効にしておく方が良いでしょう。そうすることで、
このような表示となりすっきりします。設定が終わったら図2のようにproftpdを起動して、クライアントから接続を行ってみてください。うまくいかないようであれば、proftpdをproftpd -d 10 -nのような形で起動させつつ認証を行い、トラブルシューティングを行います。LDAPサーバ側のログを確認することも忘れないでください。
まとめ
Proftpdには今回紹介したオプション以外にも、基本的なところではLDAPProtocolVersion、LDAPQueryTimeoutなどがあります。おもしろいところでは、LDAP中に数値で指定されたQuotaを参照するためのLDAPDoQuotaLookupsや、ホームディレクトリを自動作成させるためのLDAPGenerateHomedirなど、ほかにもさまざまなものが用意されています。(http://www.proftpd.org/docs/directives/linked/by-name.html)
ftpEnabledなどといった独自の属性を定義して、
とするのもおもしろそうですね。さまざまなオプションを組み合わせて、FTPとLDAPの連携を堪能してみてください!