FTP サーバーは,標準の ftpd もあるが,複雑な構成を目指す場合やや物足りない感じがある.と,いうわけで ProFTPD を使ってみた.また,ユーザー管理にシステムユーザーを追加したり,そうでなくて MySQL を使ったりする方法もあるが,ここは OpenLDAP を使ってみた.ある意味,ユーザー管理はすっきりしているといえばすっきりしている.まあ,要はかっこうつけである.
LDAP については,スキーマだの,オブジェクトだの,エントリ・ DN と難解な用語が多く,概念をすべて理解するのも一苦労だが筆者は“入門LDAP/OpenLDAP ディレクトリサービス導入・運用ガイド”(デージーネット著,秀和システム)で一応の理解を得た.こういうものは習うより慣れろ的なところもあり,そういう意味ではこの本は実用を中心にツボを得た一冊だと思う.
* OpenLDAP のインストールと設定.
インストール自体は簡単.
> cd /usr/ports/net/openldap24-server
> sudo make install
設定の前に, LDAP のデータ構成を考えておかなければならない.今回は FTP ユーザーの管理だけなので以下のようになる.
以下は gihyo.jp の LDAP の解説(
ここと
ここ)を参考にした(というか,そのまま)
-+--- dc=subdomain,dc=yourdomain,dc=suffix
|
+-+- ou=FTPGroup,dc=subdomain,dc=yourdomain,dc=suffix
| +- cn=group1,ou=FTPGroup,dc=subdomain,dc=yourdomain,dc=suffix
| +- cn=group2,ou=FTPGroup,dc=subdomain,dc=yourdomain,dc=suffix
|
+-+- ou=FTPUser,dc=subdomain,dc=yourdomain,dc=suffix
+- cn=user1,ou=FTPUser,dc=subdomain,dc=yourdomain,dc=suffix
+- cn=user2,ou=FTPUser,dc=subdomain,dc=yourdomain,dc=suffix
ドメインの構成要素がいくつもある場合(aaa.bbb.cc.ddのような場合), dc はドメインコンポーネントの略なので dc=aaa,dc=bbb,dc=cc,dc=dd とずらずら並べていけばいいようである. localhost だけで運用する場合はあまり神経質に考える必要があるとも思えない.
構成が決まったら /usr/local/etc/slap.conf を編集する. /usr/local/etc/slap.conf.default を雛形にして作るといい.変更点は以下.
/usr/local/etc/openldap
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/nis.schema
suffix "dc=subdomain,dc=yourdomain,dc=suffix"
rootdn "cn=Manager,dc=subdomain,dc=yourdomain,dc=suffix"
rootpw {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
include で始まる行は,スキーマファイルの読み込みの定義.余計なファイルを読み込んでいるかもしれないが,今回の構成では,これらのものを読み込むこととした. suffix は先の計画表の各エントリの末尾を指定するもの, rootdn 及び rootpw はいわば LDAP 管理者の名前とパスワード.パスワードは平文で記入するのではなく.必ず
> slappasswd
コマンドで得られた出力を記入する.
一応,設定ファイルが完成したら
> sudo slaptest
で,チェックを行う.エラーがなければ, rc.conf に以下を追加してサーバーとして起動を行う.
/etc/rc.conf
slapd_enable="YES"
slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/"'
slapd_sockets="/var/run/openldap/ldapi"
実際のデータ投入の前に,便利なツール phpldapadmin をインストールしておこう.
> cd /usr/ports/net/phpldapadmin
> sudo make install clean
これで投入データが一覧で一目であっているかわかるようになる. phpldapadmin の設定は, phpmyadmin (バックナンバー参照)に似ていて,また,設定方法はインストールの最後に標準出力に出てくるので必要あらば, script コマンドで出力をとっておこう.
では,データの投入だ.まず, group1 と user1 を投入する.次のファイルを作成しよう.group1の gid は 10000.user1の uid は 10000 で, user1 は group1 に属している設定.
user01.ldif
dn: dc=subdomain,dc=yourdomain,dc=suffix
objectClass: dcObject
objectClass: organization
dc: scosco
o: scosco
dn: ou=FTPGroup,dc=subdomain,dc=yourdomain,dc=suffix
objectClass: organizationalUnit
ou: FTPGroup
dn: ou=FTPUser,dc=subdomain,dc=yourdomain,dc=suffix
objectClass: organizationalUnit
ou: FTPUser
dn: cn=group1,ou=FTPGroup,dc=subdomain,dc=yourdomain,dc=suffix
objectClass: posixGroup
cn: group1
gidNumber: 10000
dn: cn=user1, ou=FTPUser,dc=subdomain,dc=yourdomain,dc=suffix
objectClass: posixAccount
objectClass: account
cn: user1
uid: user1
userPassword: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
homeDirectory: /usr/home/readonly
uidNumber: 10000
gidNumber: 10000
完成したら,
> ldapadd -x -D "cn=Manager,dc=subdomain,dc=yourdomain,dc=suffix" -W -f user01.ldif
で,rootdn のパスワードを入力して投入.成功したようなら, phpldapadmin で様子を見てみよう. organization は設定しないとはまるらしい.このユーザーは読み込み専用ユーザーの予定なので, /usr/home/readonly はただ作ればいい.オーナーは root:wheel にして,アクセス権は0644にでもしておこう.
うまくいったら,調子に乗って書き込みユーザーを作ろう.
user02.ldif
dn: cn=group2,ou=FTPGroup,dc=subdomain,dc=yourdomain,dc=suffix
objectClass: posixGroup
cn: group2
gidNumber: 10001
dn: cn=user2, ou=FTPUser,dc=subdomain,dc=yourdomain,dc=suffix
objectClass: posixAccount
objectClass: account
cn: user2
uid: user2
userPassword: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
homeDirectory: /usr/home/writable
uidNumber: 10001
gidNumber: 10001
投入
> ldapadd -x -D "cn=Manager,dc=subdomain,dc=yourdomain,dc=suffix" -W -f user02.ldif
成功したら, /usr/home/writable を作成.ユーザー名とグループ名はシステムに認識されていないので, uid と gid で指定する.すなわち:
> sudo mkdir /usr/home/writable
> sudo chown 10001:10001 /usr/home/writable
* ProFTPD のインストールと設定
インストールはそのまま
> cd /usr/ports/ftp/proftpd
> sudo make install clean
設定は /usr/local/etc/proftpd.conf.sample を参考に /usr/local/etc/proftpd.conf を作る.下記は, proftpd.conf.sample からの変更点と追加点.
/usr/local/etc/proftpd.conf
LDAPServer localhost
LDAPDoAuth on "dc=subdomain,dc=yourdomain,dc=suffix" "(&(cn=%v)(objectClass=posixAccount))"
LDAPDoUIDLookups on "ou=FTPUser,dc=subdomain,dc=yourdomain,dc=suffix"
LDAPDoGIDLookups on "ou=FTPGroup,dc=subdomain,dc=yourdomain,dc=suffix"
DefaultRoot ~ !group2
AllowOverwrite on
<Limit WRITE>
Order allow,deny
AllowUser user2
DenyAll
</Limit>
TimesGMT off
SetEnv TZ :/etc/localtime
DefaultRoot は, "~" と指定すると,ユーザーのホーム・ディレクトリより上位のディレクトリには移動できないことを示すが, "![group name]" で, [group name] グループに所属するユーザーはその制限を受けないことを指定している(ここで管理する単位がユーザーではなくグループであることに注意したい).したがって上記の例では, group2 に属する user2 はホームディレクトリだけでなく,どのディレクトリも移動できることになる. AllowOverwrite は上書きを許すかどうかであるが, user2 は書き込み可能ユーザーにしたいのでここは "on" にする.そして, <Limit WRITE> の指定は書き込みに関する制限の指定で, user2 は書き込み可能であるが,それ以外は拒否する記述である.そして,最後の2行はアップロードしたファイルのタイムスタンプやログのタイムスタンプが GMT ではなく, localtime を反映するための設定である.これで, /etc/rc.conf に
proftpd_enable="YES"
とすれば,基本的には設定完了なのであるが,ここで,パッシブモードの問題があるので以下にメモしておく.
Windows などでは ftp はデフォルトで“アクティブ”モードで動くらしいが, Gnome の Nautilus や gFTP などはデフォルトでパッシブモードで接続しようとする.そうなると,ファイアーウォールなどでポートを閉じていると外から来た FTP 接続要求に答えることができない.そこで,ファイアーウォールに穴を開けるわけだが, ProFTPD のデフォルトではポート範囲の設定がないので( 1024 から 65535 かな?)やたらめったらポートを開放しなくてはならない. ProFTPD には PassivePorts ディレクティブというのがあって,これで FTP を受けるポートの範囲を指定することができる.これを用いて, /usr/local/etc/proftpd.conf に,
PassivePorts 60000 65535 # These ports should be safe
とすれば,ポート範囲が 60000 番から 65535 番に制限できる.
それにしたがって,ファイアーウォールに穴を開けなければならないので(筆者が使っている) Packet Filter だと, /etc/pf.conf に
# accept passive FTP
pass in on $ext_if proto tcp from any to any port > 59999
とすれば,パッシブ接続を要求するクライアントからも通信することができる.
<参考> ProFTPD.org のディレクティブリスト(英語だが,日本語版より例などが豊富).
Recent Comments