前回、apacheのインストールから起動までを実施したので、今度はFTP(File Transfer Protocol)サーバーを入れて、外部からファイルの置き換えができるところまでやってみたいと思います。
ページの目次
vsftpdのインストール
まずは、vsftpdのインストールを行います。
# yum install vsftpd
バージョンは「2.2.2-11.e16_4.1」でした。
自動起動サービスの設定
vsftpdを自動起動サービスとして設定を行います。
# chkconfig --level 35 vsftpd on # chkconfig --list vsftpd vsftpd 0:off 1:off 2:off 3:on 4:off 5:on 6:off
上記のようにランレベル3と5を「on」にします。
ファイアーウォールの設定変更
「/etc/sysconfig/iptables-config」と「/etc/sysconfig/iptables」の2つのファイルを編集します。
# stored in /etc/modprobe.conf. #IPTTABLES_MODULES="" IPTABLES_MODULES="nf_conntrack_ftp"
変更1行、追加1行です。
元々存在していた6行目をコピーして7行目へ追加。(viでのコピーは”yy”でコピーして”p”で貼り付け)
6行目はコメントアウトします。代わりに7行目のダブルクォーテーションの中に「nf_conntrack_ftp」というモジュールを追加します。
# Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT
私の環境で追記したのは10行目の「-A INPUT -m state –state NEW -m tcp -p tcp –dport 21 -j ACCEPT」だけですが、7行目の「-A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT」も同様の内容になっているか確認してください。
なお、12行目はHTTPのために開いているポートです。(参照)
※FTPサーバーだけの場合は不要です。
設定が終われば、iptablesのサービスの再起動を行っておきます。
# service iptables restart
vsftpdの設定
「/etc/vsftpd/vsftpd.conf」の編集を行います。
下記は設定部分だけ抜き出しして、変更を行った行をハイライトしています。
anonymous_enable=NO ・・・・・・ (1) local_enable=YES ・・・・・・ (2) write_enable=YES ・・・・・・ (3) local_umask=022 ・・・・・・ (4) anon_upload_enable=NO ・・・・・・ (5) anon_mkdir_write_enable=NO ・・・・・・ (6) dirmessage_enable=NO ・・・・・・ (7) xferlog_enable=YES ・・・・・・ (8) connect_from_port_20=YES ・・・・・・ (9) #chown_uploads=YES ・・・・・・ (10) #chown_username=whoever ・・・・・・ (11) #xferlog_file=/var/log/xferlog ・・・・・・ (12) xferlog_std_format=YES ・・・・・・ (13) idle_session_timeout=600 ・・・・・・ (14) data_connection_timeout=300 ・・・・・・ (15) #nopriv_user=ftpsecure ・・・・・・ (16) #async_abor_enable=YES ・・・・・・ (17) #ascii_upload_enable=YES ・・・・・・ (18) #ascii_download_enable=YES ・・・・・・ (19) #ftpd_banner=Welcome to blah FTP service. ・・・・・・ (20) #deny_email_enable=YES ・・・・・・ (21) #banned_email_file=/etc/vsftpd/banned_emails ・・・・・・ (22) #chroot_local_user=YES ・・・・・・ (23) #chroot_list_enable=YES ・・・・・・ (24) #chroot_list_file=/etc/vsftpd/chroot_list ・・・・・・ (25) ls_recurse_enable=YES ・・・・・・ (26) listen=YES ・・・・・・ (27) #listen_ipv6=YES ・・・・・・ (28) pam_service_name=vsftpd ・・・・・・ (29) userlist_enable=YES ・・・・・・ (30) tcp_wrappers=YES ・・・・・・ (31) userlist_deny=YES ・・・・・・ (32)
(1) anonymous_enable: 匿名でのアクセスは禁止します。初期状態ではYESに設定されています。
(2) local_enable: 一般のユーザーをログイン可能にするか設定します。
(3) write_enable: FTPでの書き込みの許可を設定します。
(4) local_umask: 一般ユーザーがファイルをアップしたときのumaskの設定を行います。umaskはファイルのアクセス権限の許可しないビットを設定するためのもので、デフォルトの「022」は管理者には設定なし、グループや他のユーザーからの書き込みを禁止する。という設定になります。
(5) anon_upload_enable: 匿名ユーザーに対してファイルのアップロードの実行を許可するかどうかの設定です。コメントアウトを外してNOに設定しています。
(6) anon_mkdir_write_enable: 匿名ユーザーに対してディレクトリの作成を許可するかどうかの設定です。コメントアウトを外してNOに設定しています。
(7) dirmessage_enable: ディレクトリ毎に用意したメッセージファイル(.message)を、ディレクトリへ移動されたときに表示するかどうかを指定します。
(8) xferlog_enable: 転送ログを記録するかどうかを設定します。初期状態ではYESに設定されています。
(9) connect_from_port_20: ポート番号20番でのデータ接続の許可を設定します。この設定をNOにした場合、接続するポートの設定とファイアーウォールの設定を見直す必要があります。
(10)、(11) chown_uploads、chown_username: 匿名ユーザーによってアップロードされたファイルの所有ユーザーを設定します。chown_uploadsをYESにして、chown_usernameでユーザー名を指定します。特に設定していない場合はrootが所有者になります。
(12) xferlog_file: 転送ログの保存先を指定します。デフォルトは「/var/log/xferlog」になっているため、変更する場合はコメントアウトを外してファイルパスを指定します。
(13) xferlog_std_format: 転送ログのフォーマットの形式を指定します。YESを指定するとFTPでの共通ログフォーマットで記録するようになります。
(14) idle_session_timeout: クライアントからのアクセスがない場合にセッションを閉じるまでの時間(秒)を設定します。
(15) data_connection_timeout: データ転送時に転送がストール(停止)可能な最大時間(秒)を指定します。コメントアウトされている状態では300秒が設定されています。(ここでは明確化する意味をこめて300を設定するようにしています)
(16) nopriv_user: 一般ユーザーや匿名ユーザーとは別に特権を持たないユーザーの指定を行う。コメントアウトの状態では「nobody」が使用される。
(17) async_abor_enable: 非同期の転送中止コマンド(ABOR)を許可するかどうか指定を行います。
(18)、(19) ascii_upload_enable、ascii_download_enable: テキストファイルのasciiモードのダウンロード、アップロードの許可を指定します。コメントアウトを外し、YESの設定にしておくと改行コードの変換が行われるようになる。
(20) ftpd_banner: サーバーに接続したときに表示される文字列を指定します。
(21)、(22) deny_email_enable、banned_email_file: 匿名ユーザーの接続を個別に拒否するメールアドレスリストを使用するかどうかの指定と、その拒否するメールアドレスリストへのパスを指定します。
(23) chroot_local_user: ユーザーのログイン時のルートディレクトリを、設定するかどうかを指定します。(chrootは通常ならホームディレクトリになります)
(24)、(25) chroot_list_enable、chroot_list_file: chroot_local_user(23)がYESの場合、chroot_list_file(25)で指定したユーザーはユーザーのchrootディレクトリ(通常ならホームディレクトリ)より上位のディレクトリにアクセス可能に設定します。逆にchroot_local_user(23)がNOの場合、chroot_list_file(25)で指定したユーザー以外がユーザーのchrootディレクトリより上位のディレクトリにアクセス可能にします。
(26) ls_recurse_enable: ディレクトリのアップロード、ダウンロードで、ディレクトリの中の全てをアップロード、およびダウンロードするための設定です。デフォルトだとコメントアウトになっているため、コメントアウトを外してYESを設定するようにします。
(27) listen: vsftpdをスタンドアロンモードで常駐させるかどうか設定します。
(28) listen_ipv6: IPv4の代わりにIPv6のソケットで接続を待機するかどうか設定します。
(29) pam_service_name: ログインユーザー認証を行うためのPAM(Pluggable Authentication Module) 認証のサービス(ファイル)名を指定します。
(30) userlist_enable: ユーザーのリスト(/etc/vsftpd/user_list)を有効にするか無効にするかを設定します。このリストは、後述する「userlist_deny(32)」の設定を行わないとアクセスを禁止するリストになります。(つまり、新たなユーザーを追加した場合、自動的にFTPアクセス可能になります。)
(31) tcp_wrappers: TCP Wrapperによるアクセス制限の機能の使用の設定を行います。
(32) userlist_deny: ユーザーのリストに記載されているユーザーのアクセスを禁止にする(YES)か、リストに記載されているユーザーのみアクセスを可能にする(NO)かを指定します。デフォルトの記述が無かった状態では、YESが設定されておりリストに記載しないとアクセスを禁止できません。
(設定ファイルに記述が存在しない設定で、YESの場合は特に記述する必要がありませんが、今後利用したいと思うことがあってもいいようにメモ代わりに載せています)
ログイン禁止ユーザーの設定
vsftpdでログインを禁止する方法は大きく2通りあります。
- vsftpdのユーザーリスト(/etc/vsftpd/user_list)でログイン禁止ユーザーを管理する
- PAMが参照するユーザーリスト(/etc/vsftpd/ftpusers)でログイン禁止ユーザーを管理する
今回、実施するのはPAMの設定でログインを禁止する方法です。
禁止するユーザーが事前に全て判明しているのなら上記のリストのどちらかにログインを禁止するユーザーを追加していくことでログインの禁止が行えます。今回行うのは、「後からユーザーがガンガン追加される環境で、新しく追加されたユーザーはデフォルトではFTPログインを禁止したユーザーにする」というものです。
(初期設定のままで、ユーザーを追加すると、そのユーザーはFTPサーバーへのアクセスが許可されている状態になっています。)
まずは、「/etc/pam.d/vsftpd」の変更から行います。書き換え前の先頭3行目を抜き出します。
#%PAM-1.0 session optional pam_keyinit.so force revoke auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed ・・・ (以下略) ・・・
変更を行うのは3行目です。まだ、書き換え前ですが3行目の内容を分割して説明すると・・・
- auth: 認証の設定
- required: 条件を満たさない時、エラーになるが後の処理は実行される
※つまり、認証を許可していないユーザーでもパス入力が表示され、条件を満たしていなかった場合、正しいパスを入力していても認証に失敗します。(エラーのタイミングを特定させないため) - pam_listfile.so: リストファイルを使用するモジュールを利用
- item=user: ファイルの項目はユーザーと言うことを表している
- sense=deny: 禁止する項目を列挙したもの(ファイルに列挙されていない項目(ユーザー)は許可する)、と言うことを表している
- file=~: リストファイルのパスを表している
- onerr=succeed: ファイルが無かった時、エラーにせずに成功して先へ進むことを表している
となります。
これを「許可したいユーザーのファイルリストに変更する」ということと「ファイルが見つからなければログイン禁止にしておく」という設定に変えたいと思います。
具体的には以下のように書き換えます。
#%PAM-1.0 session optional pam_keyinit.so force revoke auth required pam_listfile.so item=user sense=allow file=/etc/vsftpd/ftpusers onerr=fail ・・・ (以下略) ・・・
変更したのは「sense=allow」と「onerr=fail」の2ヶ所です。
※意味としては、指定されたファイル(/etc/vsftpd/ftpusers)は許可する項目を列挙したファイルリストで、記載されていないユーザーでのログインは禁止する。もしファイルが存在しなければ認証は失敗する。になります。
ファイルリストの変更
ファイルリストは、元々用意されていたものをリネームして「ftpusers_of_denylist」にしておいて、新しく「ftpusers」のファイルを生成することにします。
# mv /etc/vsftpd/ftpusers /etc/vsftpd/ftpusers_of_denylist # vi /etc/vsftpd/ftpusers ====== [以下ftpusersの内容] ====== user1 user2
今後、ユーザーを追加した際にFTPのアカウントを有効にしたい時は「/etc/vsftpd/ftpusers」にユーザー名を追加していくことになります。
SELinuxの設定変更
今回は、SELinuxの設定を変更する必要があります。
変更するのは「allow_ftpd_full_access」で、apacheでwebサーバーを構築した際、デフォルトのドキュメントルートになっている「/var/www/html」へアクセス可能にするためのポリシーです。
このポリシーの変更を行わないと、ftpクライアントから「/var」以下のディレクトリが、一切閲覧できない状態(ファイルやディレクトリが全く見えない状態)に陥ってしまいます。
# getsebool allow_ftpd_full_access allow_ftpd_full_access --> off # setsebool -P allow_ftpd_full_access 1 # getsebool allow_ftpd_full_access allow_ftpd_full_access --> on
上記のようになっていれば成功です。
なお、「setsebool -P allow_ftpd_full_access 1」を実行した際に少し時間がかかります。
SELinux変更箇所の補足
もし、FTPからユーザーのホームディレクトリ内の変更を行いたい。と言う場合は「ftp_home_dir」のポリシーも変更する必要があります。
先ほどと同じ手順で以下のように変更、および確認を行います。
# getsebool ftp_home_dir ftp_home_dir --> off # setsebool -P ftp_home_dir 1 # getsebool ftp_home_dir ftp_home_dir --> on
vsftpdの起動とドキュメントルートのアクセス権の変更
以上で、基本的な準備は完了です。最後にvsftpdの起動と動作確認を行います。
# service vsftpd start Starting vsftpd for vsftpd: [OK]
[OK]が表示されれば成功です。
続いて、apacheのドキュメントルートのアクセス権を変更します。
ドキュメントルートは「/var/www/html」とします。
# chmod 777 -R /var/www/html
これで、htmlの直下の読み書きは自由にできるようになるはずです。
Windowsからファイルのアップロード
続いて、このftpサーバーにwindowsのwinSCPからアクセスします。
※クライアントのソフトはなんでもかまいません。(日本で昔から有名なffftpでも良いと思います。)
・「new」をクリックして新しいセッションを作ります。
① File protcol は「FTP」を選択
② Host name はサーバーのIPを指定(Port numberはそのまま)
③ User name はユーザー名
④ Password はユーザーのパスワード
なお、Accountは空欄のままでOKです。
⑤ Save は上記の内容を保存します。
ここでOKをクリックすると以下のようにセッションが追加されます。
追加されたセッションを選択し、ログインすれば「/」へアクセスできます。
apacheのドキュメントルートの変更を行っていなければ、「var」→「www」→「html」とたどり、hrmlファイルを配置すると、ブラウザからアクセス可能になります。
トラックバック & ピンバック