RedHat ES4 FTP設定あれこれ | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

RedHatES4には、デフォルトでgssftpdというパッケージが入っていますがこれがまた使いにくいと言うか・・・。


RedHatの公式サイト には、このgssptpdについてこう書かれています。


ネットワーク上で認証情報を配信しない、Kerberosされたxinetdベース のFTPデーモンです。

通常のFTPサーバーに比べたらパスワードが暗号化されている分、安全なのかな・・・?


しかしそのまま起動しても利用できません。

簡単に利用するなら、xinetdに登録されている起動設定ファイルを変更する必要があります。

# default: off
# description: The kerberized FTP server accepts FTP connections \
# that can be authenticated with Kerberos 5.
service ftp
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/kerberos/sbin/ftpd
server_args = -l -a
log_on_failure += USERID
}

上記の


server_args = -l -a

部分を


server_args = -l

に変更(-aオプションを削除)し、xinetdデーモンを再起動します。


これで、FTPサーバーとして利用する事はできますが、ユーザーごとにFTPルートを設定したり、ログインを制限させたり細かな設定がどうもできなさそう・・・。(設定ファイルが見当たらない)


しょうがないので、vsftpd を入れてみました。

RedHatのパッケージとしても、公開されているのでRedHatNetworksとかからup2date経由でインストールしてしまうのが楽です。


例えば


up2date -i vsftpd

とか。


vsftpdの設定については、「ftp サーバ(vsftpd)の設定と運用@Pocketstudio.jp Linux Wiki 」で詳しく書かれています。


とりあえず、私の環境ではデフォルトの状態から


1. anonymousFTPを禁止


2. vsftpdデーモンをxinetd経由で起動させる


3. userlist_enable=NOに設定して、/etc/vsftpd.user_listにFTPを許可するユーザーを列挙


※ userlist_enable=YESにしておくと、/etc/vsftpd.user_listファイルはFTPさせないユーザーを列挙するファイルとなります。


4. chroot_list_enable=YESに設定し、そのファイルの置き場(chroot_list_file)を設定


5. user_config_dir=/etc/vsftpd/vsftpd_user_confとして、左記ディレクトリ以下にFTPを許可して特別な設定を施すユーザー名のファイルを配置


例えば、hogeユーザーに対して、FTPルート(FTP接続した場合のルートディレクトリ。これより上位の階層には上がれない)を設定する場合


vi /etc/vsftpd/vsftpd_user_conf/hoge

でファイルを開き(作成し)


local_root=/home/hoge/ftp_dir

などと設定しておく。

hogeユーザーはFTP接続した際に、「/home/hoge/ftp_dir」ディレクトリに接続され、そこから下位のディレクトリには自由に移動できるが、これより上位には移動できなくなります。


ぐらいを設定しておきました。


陥りやすいミスとして、ユーザーごとに設定ファイルを作る場合(5.)、4.の設定を行ってchroot_list_fileで設定したファイルに、そのユーザー名を記載しておかないと有効になりません。

(hogeユーザーに対して5.の設定を行っても、chroot_list_fileに「hoge」が登録されていないと有効にならない)


後は、tcp_wrappersの設定を有効にし(デフォルトで有効ですが)、/etc/hosts.allowとhosts.denyの編集をすることも忘れずに。

これにより、クライアント側から接続されるネットワークを限定する事ができます。

(特定のネットワークからしかFTP接続を受付けない)


一方、逆の要求もあるかもしれません。

例えば、サーバーにNICが2つあり、その一方のNICに設定したIPアドレスへのみ、FTP接続を許可したい。

このような要件の場合、xinetd経由で起動するためのvsftpdの起動用ファイル(/etc/xinetd.d/vsftpdなど)に対して、以下の1行を追加してあげることで可能です。


bind = 192.168.0.100

全体の例)


service ftp
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/sbin/vsftpd
server_args = /etc/vsftpd/vsftpd.conf
log_on_failure += USERID
bind = 192.168.0.100
}


上記の設定により、サーバー上に複数設定されているIPアドレスのうち、「192.168.0.100」の方の IPアドレスへのみFTP接続が許可されます。(その他のIPアドレスへのFTP接続は受付けられなくなります。)

また、複数あるNIC(IPアドレス)ごとに事細かな設定をしたい場合もあるかもしれません。

例えば、NIC(IPアドレス)ごとに接続を許可するユーザーを分けたい場合が考えられます。

その場合、NIC(IPアドレス)の数だけ設定ファイルを用意し、その数だけvsftpdデーモンを起動するという作業になります。

上記の、xinetd経由で起動するvsftpdの起動用ファイルのうち「server_args」がそのvsftpdのデーモンの設定

ファイルになります。

なので、複数のvsftpd起動ファイルを作成し、この「server_args」を異なる設定をすれば、異なる挙動のvsftpd

デーモンを、サーバー内に複数起動させる事が可能になります。

ですが、あまり多用すると管理が煩雑になるので、やるとしても先ほどのようにNIC(IPアドレス)ごとに設定するぐらいで抑えておく方がよいかと思います。



□ おまけ


xinetd経由で起動させている理由は、簡単に言えばリソースの節約とアクセス制御の設定が楽になるからです。

今回の、vsftpdはスタンドアロンで起動させる事も可能(設定ファイルで「listen=YES」に設定)ですが、こうした場合vsftpdのデーモンが常駐する事になります。

FTPなどは、接続要求があって初めてデーモンが働く環境になるわけですので、接続要求が無い普段は、デーモンを起動させておく必要がありません。

変わりに受け付け用の窓口を立てておきます。(これがxinetd)


xinetdは、vsftpdへの接続要求があった場合にvsftpdのデーモンを起動させて処理させます。

これによりリソースが効率的に利用されます。(代わりに接続毎に起動されるので(気にする必要は無い程度ですが)重くなります)


また、xinetdはhosts.allowファイルとhosts.denyファイルによってアクセス制御を行う事が可能です。

vsftpdも設定ファイル内でアクセス制御を行う事ができますが、こうしたスタンドアロンで起動するデーモンごとに、その設定ファイル内でアクセス制御の設定を書くことは手間になります。

(ネットワークが変更になったり、アクセスを許可するIPが増えたり)

先の2つの設定ファイルでまとめて(デーモンごとも可)制御できれば、こうした事に対して楽に運用を行う事ができます。