vsftpdのセキュリティ対策2016/08/12HimaJyunWebサーバでコンテンツを管理するために導入されているFTPそのFTP用のサーバとして利用されているvsftpd、どうすればこれをより安全に出来るか、自分の知り得る方法をいくつか紹介してみようと思います。16.04として説明を進めますが、設定の話なのでCentOSでもそう変わらないでしょう。パスワードの強化もはやFTP云々は関係ないですが、やはりパスワードが強力である事に越した事はありません。「0000」なんて以ての外ですよ、サーバなんですから12桁くらいはあった方が良いでしょう。(もちろん、パスワードが強ければ完璧と言う訳ではありませんが......)パスワード変更のコマンドは「passwd」です。SSLの有効化せっかくのよいパスワードであっても通信のやり取りが暗号化されてなければ全くの無意味です。FTPでもSSLを利用できるように設定しましょう。設定ファイルを開きます。/etc/vsftpd.conf以下を参考に設定を変更します。使用する証明書、snakeoilはUbuntuインストール時に自動で用意されるオレオレ証明書rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pemrsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.keyFTPSとSFTPFTPは暗号化されていないので論外だとして、FTPSとSFTPを混同している方が案外多い様なので念のため説明しておきます。FTPSは「SSLで暗号化したFTP」、対してSFTPは「SSHで暗号化したファイル転送」これらの2つはまず第一に根本的に違う物です、同じ様な名前で同じ様な事が出来るってだけで全く異なる仕組みです。FTPSは1つの規格として決まっている物ですが、SFTPは単にSSHサーバの機能の1つとして提供されているだけなので規格などはありません。鍵認証を使えると言う点ではSFTPの方がより安全かも知れませんが、WordPressを利用したければほぼ必然的にFTPSになるかと思われます。WordPressも実はSFTPが使えるのですが、秘密鍵と公開鍵の両方をサーバ上に置くとか言うクソお察し実装なので、WordPressを使う予定があるのであればFTPSでよいでしょう。(もう少しマシな実装のプラグインもありますが、FTPSで間に合う物をSFTPにするためにプラグインを使うってのもちょっと)匿名アカウントのログインを拒否FTPにはファイル配布に使うためのアノニマスFTPと言う物があります。これは、FTPに必要なユーザ認証の際にユーザ名を「anonymous」にする(パスワードは慣習的に自分のメールアドレスにする)事で誰でもログイン出来る様にする機能です。今でもアノニマスFTPで配布されている事は多々ありますが、それらはほぼ大抵多くの場合同時にHTTPでも配布されています。(昨今のコンピュータや回線などは非常に発達しているのでHTTPで配信しても十分間に合う)が、その仕組みはよほど特殊な用途に限られます、普通に使う分には誰でもログイン出来る危険性を孕むデメリット以外の何物でもないので無効化してしまいましょう。先程同様「/etc/vsftpd.conf」を開いて、以下の様に設定します。anonymous_enable=NO普通はデフォルトでNOだとは思いますが、一応確認しておきましょう。ftpd_bannerも一応変更FTPでは接続時にサーバからウェルカムメッセージとやらを送信するのですが、vsftpdではデフォルトでご親切にバージョンを自白する様になっています。バージョンが入ってるくらい(きちんとアップデートしていれば)実際どうって事ないのですが、Webサーバ基準で考えると「メッセージにバージョンが含まれるなんて論外だZe!!(言い過ぎ?」がデフォなので一応同じようにバージョンを自白しないように変更しておこうと思います。言っても簡単、「/etc/vsftpd.conf」の「ftpd_banner」に適当な文字を設定するだけです。ftpd_banner=AIEEEEE!!(やらない方が良いとは思いますが)一応日本語でも行けるみたいですよ、少なくとも手元のFileZiilaでは......更にセキュアにここから少しややこしくなって来ますが頑張って付いてきてくださいね~ポート番号を変更FTPで使用するポート番号をデフォルト以外の物に変えるだけでもかなりの効果があるようです。例によって「/etc/vsftpd.conf」に以下の様に追記します。listen_port=1002110021の所は何番でも良いですが、基本1024~49151番を使うのが良いでしょう。0~1023番はウェルノウンポートで重複の可能性が高いので使わない方が良いです。49152~65535番はどちらかと言うとクライアントが接続のために使うポートとしての利用が多いでしょうから、やはりあまり使わないかとここはオフトピックなので詳しい説明はWikipediaに投げるとして、早い話他のサービスと被りさえしなければ良いのです。普通は管理者ユーザとWebサイト用ユーザは分ける物です。今回の場合Webサイト用ユーザのみがログイン出来れば良い訳であって、それ以外のユーザはログインさせる必要がありません(それこそ、管理者ユーザは鍵認証のSFTPを使う、などの使い分けを行えばよいのです。)「/etc/vsftpd.conf」に以下の様に追記してユーザリストを利用することで実現できます。ユーザリストのファイルを指定userlist_file=/etc/vsftpd/user_list次に「userlist_file」で指定したファイルにログインを許可するユーザを記載して行きます。1行に1ユーザずつ記載して行きます、例として「hoge」と「fuga」ユーザのログインを許可する場合は以下の様になります。hogefugaこうする事で不必要なユーザがログイン出来なくなり、意図しないユーザでログインされる可能性をなくせます。特定のディレクトリしか操作出来ないようにする複数人でバーチャルホストを利用して別々のサイトを公開している、とかでもない限り、Webサイトのコンテンツは「/var/www」とかにあると思います。Webサイトを管理するユーザが「/var/www」より上のディレクトリ(/varとか)を操作出来る必要はありません。制限して不必要なファイルを触られないようにしましょう、そうすればもし仮にアカウントを乗っ取られたとしてても被害を抑える事が可能です。chrootの例外リストの場所chroot_list_file=/etc/vsftpd/chroot_list「chroot_list_file」で指定したファイルに記載されているユーザは例外的にchrootの対象から外すことが出来ます。例として「fuga」と「piyo」ユーザを例外にする場合の設定です。「hoge」ユーザのコンテンツは「/var/www/hoge」に、「fuga」ユーザのコンテンツは「/var/www/fuga」にある場合にchrootを活用したい場合はuser_configが役に立ちます。「/etc/vsftpd.conf」に「user_config_dir」を追記しましょう。user_config_dir=/etc/vsftpd/user_conf「user_config_dir」で指定した場所にディレクトリを作成します。/etc/vsftpd/user_confそしてその中にユーザ名と同じ名前のファイルを作成し、上書きする設定を書いていきます。/etc/vsftpd/user_conf/hogeその中に上書きしたい設定を書き込みます。local_root=/var/www/hogechroot+WordPressの注意点WordPressの更新などでFTPを利用する際にchrootが有効になっていると、WordPress(PHP)の取得するパスとFTP上でのパスに相違が発生します。これはwp-config.phpに以下の3つの設定を加えることで解決できます。'/wp/wp-content/plugins/');ここで指定するパスは「FTPから見たWordPressのパス」です、早い話が「実際のパスからchroot分を取り除いたパス」です。え?分かりづらいって?、WordPressが「/var/www/wp」にあって、chroot(local_root)のパスが「/var/www」なら「/wp/」を指定するのですよ。FTP専用ユーザにする普通は管理者ユーザとWebサイト用ユーザは分ける物です。(2回目)Webサイト用ユーザはFTPでしかログインされない事が分かり切っています。それではどうするか、そのユーザをFTP以外でログイン出来なくすれば良いのです。ログイン出来るシェル、出来ないシェルvsftpdはそのユーザがログイン出来るか否かを設定されたデフォルトシェル(多くの場合/bin/bashになっている)で判別します。ユーザのデフォルトシェルが「/etc/shells」と言うファイルに記載されていればログイン可能、されていなければ不可能、となります。ユーザをFTP専用にするCentOSとかだと/sbin/nologinが/etc/shellsに含まれていて、デフォルトシェルにこれを指定するだけで良いみたいです。Ubuntuの場合は含まれておらず、また、daemonによって/bin/falseだったり/sbin/nologinだったりを使用しているので、どちらか片方を/etc/shellsに追加するのは抵抗があります。ここでは一目でFTP専用だと分かる「ftponly」シェルを作成、追加してFTP専用ユーザを作成しようと思います。適当な場所(/usr/local/bin/ftponly)にファイルを作成します。/usr/local/bin/ftponly中身はFTPしか使えない事を示すテキストをechoしてやれば十分でしょう。/etc/shellsFTP専用にするユーザのデフォルトシェルにこれを指定します。最後に一通りの設定が終わったら再起動しましょう。vsftpdあくまで僕の知っている手法をいくつか掲載しただけですが、セキュリティ対策としては十分使える手法だと思います。Daemon」の略ですよ、なので稀に「vsFTPd」と記載されている事があるのです。(更にどうでも良いですが、daemonとdemonは厳密には微妙に異なるのですよ、ざっと説明するとdaemonは守護天使とかの意味です。Encrypt製証......続きを読む→[Bash]screenが終了するまで待機する僕の運営するマイクラ鯖はscreenで動かしています。1.9がリリースされてしまいました。Piをサーバと......続きを読む→PREVMuninプラグインの作り方NEXT[Bukkit]従量課金制/flyプラグイン「EbiFly」を作ったナカのヒト:HimaJyun​散って美しいのは桜だけです、情報はまとまっていた方が美しいのです。