このページの対象Linuxディストリビューションは次のものです。


2011/04/18 作成
2011/05/23 更新

ftpサーバ(vsftpd)の設定


方針

  1. ASCII転送が出来る。
  2. ホームディレクトリのpublic_html以下しかアクセス出来ない。
  3. 許可されたローカルユーザーしかアクセス出来ない。
  4. アップロードしたファイルにユーザー以外の書込み権を付与しない。

作業

sudoの設定が未だならsudoを設定する

インストール

$ sudo yum install vsftpd

Is this ok [y/N]: と表示される。
'y'を入力する。

設定ファイルをの編集

$ sudo nano /etc/vsftpd/vsftpd.conf

設定ファイルはオプション=値の形式で設定する。
=の前後にスペースを入れるとエラーになる。

anonymous_enable
anonymous_enable=YES
anonymousログインを認めるかの設定。
禁止するのでNOにする。
anonymous_enable=NO
local_enable
local_enable=YES
ローカルユーザーのログインを認めるかの設定。
そのままにする。
write_enable
write_enable=YES
書込み(アップロード、削除等)を認めるかの設定。
そのままにする。
local_umask
local_umask=022
umaskの設定。
そのままにする。
anon_upload_enable
#anon_upload_enable=YES
anonymousログインで書込みを認めるかの設定。
認めないのでコメントのまま。
anon_mkdir_write_enable
#anon_mkdir_write_enable=YES
anonymousログインでディレクトリの生成を認めるかの設定。
認めないのでコメントのまま。
dirmessage_enable
dirmessage_enable=YES
新たなディレクトリに初めて入ったときにメッセージを表示するかの設定。
そのままにする。
xferlog_enable
xferlog_enable=YES
ログファイルにアップロードとダウンロードの詳細を記録するかの設定。
そのままにする。
connect_from_port_20
connect_from_port_20=YES
データ接続でサーバがポート20を送信元ポートにするかの設定。
ポート20を使用するのでそのまま。
chown_uploads
#chown_uploads=YES
anonymousログインでアップロードされたファイルの所有者を変更するかの設定。
YESにした場合はchown_usernameで指定したユーザーにする。
コメントのまま。
chown_username
#chown_username=whoever
anonymousログインでアップロードされたファイルの所有者を変更す場合のユーザーを指定する。
コメントのまま。
xferlog_file
#xferlog_file=/var/log/vsftpd.log
ログファイルのファイル名の設定。
デフォルト(/var/log/vsftpd.log)でよいのでコメントのまま。
xferlog_std_format
xferlog_std_format=YES
ログをxferlogのフォーマットにするかの設定。
そのままにする。
idle_session_timeout
#idle_session_timeout=600
なにもしなかった場合のタイムアウト時間の設定。
デフォルト(300)でよいのでコメントのまま。
data_connection_timeout
#data_connection_timeout=120
データ転送時に進捗が無い場合のタイムアウト時間の設定。
デフォルト(300)でよいのでコメントのまま。
nopriv_user
#nopriv_user=ftpsecure
特権がいらない場合の権限の指定。
デフォルト(nobody)でよいのでコメントのまま。
async_abor_enable
#async_abor_enable=YES
非同期ABORを認めるかの設定。
認めないのでコメントのまま。
ascii_upload_enable
#ascii_upload_enable=YES
アップロードでASCII転送を認めるかの設定。
認めるのでコメントを外し有効にする。
ascii_upload_enable=YES
ascii_download_enable
#ascii_download_enable=YES
ダウンロードでASCII転送を認めるかの設定。
認めるのでコメントを外し有効にする。
ascii_download_enable=YES
ftpd_banner
#ftpd_banner=Welcome to blah FTP service.
接続した時に表示するメッセージを指定する。
コメントのままにする。
deny_email_enable
#deny_email_enable=YES
anonymousログインを拒否するリストを有効にするかの設定。
コメントのままにする。
banned_email_file
#banned_email_file=/etc/vsftpd.banned_emails
deny_email_enableがYESの場合に拒否するリストのファイル名を指定する。
拒否するリストはメールアドレスで指定する。
コメントのままにする。
chroot_local_user
#chroot_local_user=YES
ローカルユーザーがログイン後にホームディレクトリにchrootするかの設定。
コメントを外し有効にする。
CentOS 5.6ではこの項目は記述されていないので追加する。
chroot_local_user=YES
chroot_list_enable
#chroot_list_enable=YES
chroot_listを有効にするかの設定。
chroot_local_userの設定で意味がかわる。
chroot_local_userがNOの場合、chroot_list_fileはchrootするユーザーを指定する。
chroot_local_userがYESの場合、chroot_list_fileはchrootしないユーザーを指定する。
コメントを外し有効にする。
chroot_list_enable=YES
chroot_list_file
#chroot_list_file=/etc/vsftpd/chroot_list
chroot_list_enableがYESの場合のユーザーを記述するファイルを指定する。
chroot_local_user、chroot_list_enableの両方ともYESの場合ここで指定するファイルがないとアクセス出来ない。
デフォルトのまま使用するのでコメントのままでも良いがコメントを外し有効にする。
chroot_list_file=/etc/vsftpd/chroot_list
ls_recurse_enable
#ls_recurse_enable=YES
ls -Rを使用できるかの設定。
コメントのままにする。
listen
listen=YES
スタンドアローン(デーモン)として起動するかの設定。
そのままにする。
listen_ipv6
#listen_ipv6=YES
スタンドアローン(デーモン)として起動するかの設定。
IPv6で待ち受ける。
listenとlisten_ipv6は片方しか有効に出来ない。
コメントのままにする。
pam_service_name
pam_service_name=vsftpd
PAMサービス名の指定。
そのままにする。
userlist_enable
userlist_enable=YES
ユーザーリストを使用しアクセスできるユーザーを制限するかの設定。
そのままにする。
tcp_wrappers
tcp_wrappers=YES
tcp_wrappersを使用したアクセス制限を行うようにするかの設定。
YESにすると/etc/hosts.allowと/etc/hosts.denyでアクセス制御できる。
そのままにする。

このままではローカルユーザーは誰でもアクセス出来る。
アクセスできるユーザーを制限するリストを作成する。
リストに載っているユーザーのみアクセス出来るようにする。
またアクセス出来る場所をホームディレクトリのpublic_html以下にのみにする。
設定ファイルに設定を追加する。

userlist_deny
YESの場合、ユーザーリストはアクセスを拒絶するユーザーのリストになる。
NOの場合、ユーザーリストはアクセスを許可するユーザーのリストになる。
NOにする。
userlist_deny=NO
userlist_file
ユーザーリスト用のファイルを指定する。
/etc/vsftpd/user_listにする。
userlist_file=/etc/vsftpd/user_list
local_root
ログイン後に移動するディレクトリを指定する。
chrootが有効になっている場合、chroot後のルートを指定する。
public_htmlにする。
local_root=public_html
指定するディレクトリはシンボリックリンクでも構わない。
"公開"ディレクトリにリンクを張るには次のようにする。
$ ln -s ~/公開 ~/public_html

chroot_local_user、chroot_list_enableの両方をYESにしたのでchroot_list_fileが存在しないとログインを拒絶される。
空の/etc/vsftpd/chroot_listを作成する。

$ sudo touch /etc/vsftpd/chroot_list

/etc/vsftpd/user_listがアクセスを拒絶するユーザーのリストになっている。
許可するユーザーのリストに編集し直す。

$ sudo nano /etc/vsftpd/user_list

記述されているユーザーをすべてコメントアウトし許可するユーザーを追加する。
リストはユーザー名をそのまま記述すればよい。

SELinuxの設定

SELinuxが有効の場合は設定の変更を行う必要がある。
SELinuxの設定でhomeディレクトリへのアクセスが禁止されている。
確認する。

$ sudo /usr/sbin/getsebool -a | grep ftp

ftp_home_dir --> off
(ホームディレクトリ部分のみ抜粋)

homeディレクトリへのアクセスを許可する。

$ sudo /usr/sbin/setsebool -P ftp_home_dir 1

完了まで少し時間が掛かる。

確認する。

$ sudo /usr/sbin/getsebool -a | grep ftp

ftp_home_dir --> on
(ホームディレクトリ部分のみ抜粋)

iptablesの設定

iptablesの設定はGUIでも行うことが出来る。
CentOS 5.6の場合は[システム]-[管理]-[セキュリティレベルとファイヤーウオールの設定]を選択する。
Scientific Linux 6.0、fedora 14の場合は[システム]-[管理]-[ファイヤーウオール]を選択する。
fedora 15の場合は[アプリケーション]-[その他]-[ファイヤーウオール]を選択する。
[FTP]にチェックを入れ[適用]をクリックする。
コマンドラインでの設定は以下になる。

ftpのデータ用ポートの為のモジュールを読込む様に設定ファイルを変更する。

$ sudo nano /etc/sysconfig/iptables-config

Scientific Linux 6.0、fedora 14、15の場合
IPTABLES_MODULES=""

IPTABLES_MODULES="ip_conntrack_ftp"
に変更する。

CentOS 5.6 の場合
IPTABLES_MODULES="ip_conntrack_netbios_ns"

IPTABLES_MODULES="ip_conntrack_netbios_ns ip_conntrack_ftp"
に変更する。

この部分はファイヤーウオールの設定しだいで元の状態が違う可能性がある。
元の状態が何であれIPTABLES_MODULESにip_conntrack_ftpを追加すれば良い。

ポート21への通信を受付ける様にする。
現在の設定を確認する。

$ sudo /sbin/service iptables status

Scientific Linux 6.0、fedora 14、15の場合

テーブル: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

CentOS 5.6の場合

テーブル: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    RH-Firewall-1-INPUT  all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    RH-Firewall-1-INPUT  all  --  0.0.0.0/0            0.0.0.0/0

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

Chain RH-Firewall-1-INPUT (2 references)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 255
3    ACCEPT     esp  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     ah   --  0.0.0.0/0            0.0.0.0/0
5    ACCEPT     udp  --  0.0.0.0/0            224.0.0.251         udp dpt:5353
6    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:631
7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:631
8    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
9    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
10   REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

ポート21への許可の設定はstate RELATED,ESTABLISHEDの設定とREJECTの設定の間に設定する。

Scientific Linux 6.0、fedora 14、15の場合、INPUTの4番目の位置に挿入する事にする。

$ sudo /sbin/iptables -I INPUT 4 -m state --state NEW -p tcp -m tcp --dport 21 -j ACCEPT

CentOS 5.6 の場合、RH-Firewall-1-INPUTの9番目の位置に挿入する事にする。

$ sudo /sbin/iptables -I RH-Firewall-1-INPUT 9 -m state --state NEW -p tcp -m tcp --dport 21 -j ACCEPT

挿入した位置より後ろのルールは1つずつずれる。
ポート21の設定を挿入する場所はパケットを破棄するREJECTの設定より前ならば良い。
そして一旦確立した通信を許可しているstate RELATED,ESTABLISHEDより後ろが効率が良いと思う。
GUIを使用して設定した場合もこの位置に挿入される。

iptablesの設定を設定ファイル(/etc/sysconfig/iptables)に保存する。

$ sudo /sbin/service iptables save

設定ファイルを保存することによって電源を切っても保持される。
保存されたファイルはiptable起動時に読込まれる。

iptablesを再起動(停止してから開始)する。

$ sudo /sbin/service iptables restart

iptablesの設定を確認する。

$ sudo /sbin/service iptables status

TCPWrappersの設定

デフォルトでは/etc/hosts.allowと/etc/hosts.denyに何も記述されていない。
そのままならば何もしなくてよい。
もし/etc/hosts.denyにALL:ALLのように接続を制限する記述があるならば/etc/hosts.allowに接続を許可する設定を記述する。
vsftpd:ALLですべてのアドレスからの接続を受け付ける。
vsftpd:192.168.0.0/24で「192.168.0.0/24」のネットワークからの接続を受け付ける。

サーバ(デーモン)の起動

vsftpdの起動

$ sudo /sbin/service vsftpd start

起動時にvsftpdも起動する

このままでは再起動するとvsftpdが停止した状態なので起動時にvsftpdも起動する様にする。

$ sudo /sbin/chkconfig vsftpd on

確認する。

$ sudo /sbin/chkconfig --list vsftpd

vsftpd          0:off   1:off   2:on    3:on    4:on    5:on    6:off

ランレベル2、3、4、5で起動する様になっている。

完了


コマンド一覧

ftpサーバを開始する。
sudo /sbin/service vsftpd start
もしくは
sudo /etc/init.d/vsftpd start
ftpサーバを停止する。
sudo /sbin/service vsftpd stop
もしくは
sudo /etc/init.d/vsftpd stop
ftpサーバを再起動(停止してから開始)する。
sudo /sbin/service vsftpd restart
もしくは
sudo /etc/init.d/vsftpd restart
もしくは
sudo /sbin/service vsftpd reload
もしくは
sudo /etc/init.d/vsftpd reload
(restartとreloadは/etc/init.d/vsftpdで同じcase文になりstopとstartを呼び出している。)
ステータスを表示する。
sudo /sbin/service vsftpd status
もしくは
sudo /etc/init.d/vsftpd status
マシンの起動時に自動的にftpサーバが起動するようにする。
sudo /sbin/chkconfig vsftpd on
マシンの起動時に自動的にftpサーバが起動するのをやめる。
sudo /sbin/chkconfig vsftpd off
新しいログを10行表示する。
sudo tail /var/log/xferlog
ログが追加されてたら表示する。
sudo tail -f /var/log/xferlog

2011/04/19

トラブルシューティング(接続出来ない)

設定をミスする事によって接続出来ないかもしれない。
また原因は複数かもしれない。
接続出来ない場合は以下の手順によって確認する。

SELinuxのアクセス制御を外す

SELinuxの状態がEnforcingモードの場合、Permissiveモードにする。
Permissiveモードはログの出力は行うがアクセス制御は行わないのでSELinuxの設定のどこが問題か判るかもしれない。

$ sudo /usr/sbin/setenforce 0

Permissiveモードになったか確認する。

$ /usr/sbin/getenforce

Permissiveモードにする事で解決したならばSELinuxの設定に問題がある。
ログを確認し何が問題か調べる。
ログファイルはデフォルトでは/var/log/messagesになる。
また、起動時のSELinuxの状態を設定する場合は/etc/sysconfig/selinuxを編集する。

$ sudo nano /etc/sysconfig/selinux

SELINUX=enforcingSELINUX=disabledに変更するとSELinuxを無効に出来る。

これで解決できない場合はiptablesの設定を変更する。

iptablesを停止させる

$ sudo /sbin/service iptables stop

これで接続出来るようになるとiptablesの設定に問題がある。
ip_conntrack_ftpがロードされているか確認する。

$ /sbin/lsmod | grep ftp


ip_conntrack_ftp       41361  0
ip_conntrack           91621  3 ip_conntrack_ftp,ip_conntrack_netbios_ns,xt_state

また設定ファイルを確認しポート21を開けているのを確認する。

TCPWrappersの設定を変更する

/etc/hosts.denyをすべてコメントアウトして接続できるか確認する。
デフォルト状態ではコメントしか記述されていないが何かのおり設定を記述したかもしれない。
設定を変更したらvsftpdを再起動する。

vsftpd.confの設定を変更する

anonymousの設定を無効にしたが有効にしてanonymousで接続できるか確認する。
これで接続できる場合はローカルユーザーのアクセス制御の設定かchrootの設定を間違えている可能性が高い。
chroot_listが存在すかもしくは別のファイルを指定したかも確認する。

vsftpd.confの設定が正常になったら、無効にしたアクセス制御を逆の順で有効にして確認する。


2011/05/02

IPv6対応

fedora 14の場合

fedora 14の場合はvsftpd.confの設定でlistenをコメントアウトしlisten_ipv6を有効にすればIPv6の通信は出来る。
ただしIPv4での通信が出来なくなる。
ipv6tablesの設定も行う必要がある。
/etc/sysconfig/ip6tables-configを開きIP6TABLES_MODULESにnf_conntrack_ftpを追加する。
またip6tablesにポート21の通信を許可する設定を行う。
GUIでファイヤーウオールの設定を行えばIPv6、IPv4両方の設定がされる。

CentOS 5.6の場合

CentOS 5.6の場合はIPv6は使えないようだ。
vsftpd.confの設定でlistenをコメントアウトしlisten_ipv6を有効にすればポート21に対する通信は出来る。
この状態でIPv4の通信は問題なく行える。
しかしIPv6用のconntrack_ftpのモジュールが無い様だ。
ip6tablesを停止させても、lsやdirでエラーになる。
200 EPRT command successful. Consider using EPSV.
---> NLST
500 OOPS: vsf_sysutil_bind

IPv4だと成功する。
200 PORT command successful. Consider using PASV.
---> NLST
150 Here comes the directory listing.

他のIPv6が成功するディストリビューションだと以下になる。
200 EPRT command successful. Consider using EPSV.
---> NLST
150 Here comes the directory listing.


リンク

参考

関連


[Top][Page Top]


サイト全体のアクセスカウンタ

はてなブックマークに追加 Google Bookmarks に追加 livedoorクリップに追加