ライン

ポイント:*

ライン

 はじめに

CentOS 6.6

 今回は、vsftpdを使ったFTPサーバを作る話。自分のサーバではないので、CentOSで作ることにしました。
普通に公開ウェブサーバが欲しいとのことで、Apache 2.2系を準備し、FTPのユーザはバーチャルユーザのみで構成する形で作ります。
 VMware 以下のゲストとしてOSバージョンは、Cent OS 6.6を利用することにしました。

 OS環境まわり+パッケージ導入

 まずは、sshでログインするユーザを作成することに。

# useradd -d /home/USER -s /bin/bash -u 1001 -m USER -G wheel

 UIDは、なんとなくFreeBSDっぽい値にしてみた。
/etc/pam.d/suファイルを編集して、以下を有効(コメントをはずす)にしました。
これで、誰でもrootで上がれるようになっている状態ではなくなりました。

auth            required        pam_wheel.so use_uid

 /etc/ssh/sshd_configの最後に

AllowGroups     wheel

を加えたり、PermitRootLogin noに変更したり、ChallengeResponseAuthentication yesにしてみたり。

 でも通常は、suで作業させたくないかな。sudo関連を追加。visudoで

USER ALL=(ALL) NOPASSWD: ALL

 を追加。必要な時には sudo -iで利用できます。

 さて、今回はvsftpdを利用するので、リアルユーザを1つ振り出しておきました。

# useradd -d /home/www vftpuser -u 2000 -m vftpuser

 ここで作成した /home/www 以下に各ユーザのドキュメントルートになります。

 さて、まずは今回利用するパッケージを追加します。

# yum install vsftpd
# yum install httpd
# yum install db4-utils
# chkconfig vsftpd on
# chkconfig httpd on

 /etc/selinux/configの設定を変えます。SELINUX=enforcingを以下に変更。

SELINUX=disabled

 /etc/sysconfig/iptables-configを変更。

IPTABLES_MODULES="ip_conntrack_ftp"

 /etc/sysconfig/iptablesを追加。

-A INPUT -p tcp -m tcp --dport 80  -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 20:21 -j ACCEPT

 まずはざっくりとこんな感じ。

趣味な設定

 以下を.bashrcに追加しました。

bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'

 vimで生活したいので、これも毎度で加えました。

# yum install vim
# vi .bashrc
..
alias vi='vim'
..
# source .bashrc

その他、FreeBSDで慣れた操作ができるようなものは加えています。

 設定

/etc/vsftpd/

 設定ファイルはここにあります。

# ll
合計 48
-rw-------. 1 root root   125 10月 18 08:54 2014 ftpusers
-rw-------. 1 root root    25  3月 24 22:14 2015 logins.txt
-rw-------. 1 root root   361 10月 18 08:54 2014 user_list
-rw-------  1 root root  4647  3月 25 23:00 2015 vsftpd.conf
-rw-------. 1 root root  4599 10月 18 08:54 2014 vsftpd.conf.orig
-rwxr--r--. 1 root root   338 10月 18 08:54 2014 vsftpd_conf_migrate.sh
-rw-r--r--. 1 root root 12288  3月 24 22:14 2015 vsftpd_login.db
drwxr-xr-x. 2 root root  4096  3月 25 22:31 2015 vsftpd_user_conf

vsftpd.confのオリジナルは、vsftpd.conf.origで保存。

-anonymous_enable=YES
+##anonymous_enable=YES
+anonymous_enable=NO
+#local_enable=NO
+chroot_local_user=YES
+guest_enable=YES
+guest_username=vftpuser
+virtual_use_local_privs=YES
+anon_other_write_enable=YES
+anon_world_readable_only=NO
+use_localtime=YES
+xferlog_std_format=NO
+vsftpd_log_file=/var/log/vsftpd.log
+log_ftp_protocol=YES
+anon_upload_enable=YES
+anon_mkdir_write_enable=YES
-xferlog_std_format=YES
+xferlog_std_format=NO
+ascii_upload_enable=YES
+ascii_download_enable=YES
-#listen_ipv6=YES
+listen_ipv6=NO
+user_config_dir=/etc/vsftpd/vsftpd_user_conf/
+pasv_enable=YES
+pasv_min_port=30000
+pasv_max_port=32000

…こんな感じに決定してみました。趣味的なものもあるけど、パッシブモードはありにしています。
vsftpd_user_confのディレクトリは mkdir vsftpd_user_conf で作成しています。

バーチャルユーザの追加

 テキストファイルでユーザを作成するのは気持ちが悪いのだけれど、ここは割り切って良しとしました。
logins.txtを作成します。chmod 600 logins.txtにして、最低限の悪あがき。

ftpuser1@example.com
PASSWORD

奇数行と偶数行でIDとパスワードを交互に書いていく形式で作成していきます。

これをdbの形に変えます。

# db_load -T -t hash -f /etc/vsftpd/logins.txt /etc/vsftpd/vsftpd_login.db

上記のように変更。
PAMファイルを変更して、これを使うように変えます。
/etc/pam.d/vsftpdを変更します。

#%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
#auth       required    pam_shells.so
#auth       include     password-auth
#account    include     password-auth
#session    required     pam_loginuid.so
#session    include     password-auth
##auth          required        pam_userdb.so   db=/etc/vsftpd/vsftpd_login
##account               required        pam_userdb.so   db=/etc/vsftpd/vsftpd_login

auth            sufficient      /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
account         sufficient      /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login

上記のように、2行を残して保存。

ユーザの利用

 設定したファイルを更新するために、各種サービスを上げ下げします。わからない人はサーバのリブートでも良いかと。

/etc/vsftpd/vsftpd_user_conf/ftpuser1@example.com というファイルを作成します。

local_root=/home/www/ftpuser1@example.com

 のような設定ファイルを書きました。
後は、ディレクトリの準備をします。

# chmod 755 /home
# mkdir /home/vftpuser
# chmod 755 /home/www
# chown vftpuser:vftpuser /home/www
# mkdir /home/www/ftpuser1@example.com
# chmod 755 /home/www/ftpuser1@example.com
# chown vftpuser:vftpuser /home/www/ftpuser1@example.com

 これでこのユーザは、上記をドキュメントルートとしてFTPデータアップロードをすることで完了です。

アクセス制限

 高度な対策はしませんが、TCP Wrapperによる制限はしていますので、/etc/hosts.allow と hosts.denyで制限を付けます。
/etc/hosts.denyには

ALL : ALL

と記載し、/etc/hosts.allowには

vsftpd : .jp

と記載して、とりあえず国外よりのアクセスを制限してしまいます。
もちろん、海外でも .jpの名前で登録されていれば可能です。

Apacheの設定

 Namedベースでウェブサーバを設定します。
/etc/httpd/confに設定を加えます。
直接編集したくないのであれば、最終行辺りに、include conf/vhostsetting.confのように別ファイルで作ります。

NameVirtualHost xxx.yyy.zzz.aaa:80

<VirtualHost xxx.yyy.zzz.aaa:80>
    ServerAdmin         webmaster@example.net
    DocumentRoot        /home/www/ftpuser1@example.com
    ServerName          www.example.com
    ServerAlias         ftp.example.com
    ErrorLog            logs/example.com.xyz-error_log
    CustomLog           logs/example.com-access_log common

<Directory "/home/www/ftpuser1@example.com">
    AllowOverride FileInfo AuthConfig Limit
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    Order allow,deny
    Allow from all
</Directory>

</VirtualHost>

 これですべての設定ができました。
ちなみにログは、シンボリックリンクで /var/log/httpdに作成されますので確認してみましょう。

 動作確認

 ffftpで接続してファイルを置いてみます。

こんな感じ。

FFFTP Ver.1.98g Copyright(C) 1997-2010 Sota & cooperators.
Copyright (C) 2011-2013 FFFTP Project (Hiromichi Matsushima, Suguru Kawamoto, IWAMOTO Kouichi, vitamin0x, unarist, Asami, fortran90, tomo1192, Yuji Tanaka, Moriguchi Hirokazu).
デフォルトのマスターパスワードが使われます.
マルウェアの攻撃を防ぐため,固有のマスターパスワードを設定することをおすすめします
OpenSSLが読み込まれました.
----------------------------
FTP over Explicit SSL/TLS (FTPES)を使用します.
ホスト ftp.example.com を探しています. (TCP/IPv4)
ホスト ftp.example.com を探しています. (TCP/IPv6)
ホスト ftp.example.com (xxx.yyy.zzz.aaa (21)) に接続しています. (TCP/IPv4)
接続しました. (TCP/IPv4)
ホスト ftp.example.com が見つかりません. (TCP/IPv6)
220 (vsFTPd 2.2.2)
>AUTH TLS
530 Please login with USER and PASS.
>AUTH SSL
530 Please login with USER and PASS.
ログインできません.
通信は暗号化されていません.
第三者にパスワードおよび内容を傍受される可能性があります.
ホスト ftp.example.com を探しています. (TCP/IPv4)
ホスト ftp.example.com (xxx.yyy.zzz.aaa (21)) に接続しています. (TCP/IPv4)
接続しました. (TCP/IPv4)
220 (vsFTPd 2.2.2)
>USER ftpuser1@example.com
331 Please specify the password.
>PASS [xxxxxx]
230 Login successful.
>FEAT
211-Features:
 EPRT
 EPSV
 MDTM
 PASV
 REST STREAM
 SIZE
 TVFS
 UTF8
211 End
>OPTS UTF8 ON
200 Always in UTF8 mode.
>>CD -***-
>CWD /
250 Directory successfully changed.
>XPWD
257 "/"
>TYPE A
200 Switching to ASCII mode.
>PASV
227 Entering Passive Mode (xxx.yyy.zzz.aaa,157,192).
ダウンロードのためにホスト xxx.yyy.zzz.aaa (30384) に接続しています. (TCP/IPv4)
接続しました. (TCP/IPv4)
>LIST
150 Here comes the directory listing.
226 Directory send OK.
ファイル一覧の取得は正常終了しました. (68 Bytes)

こんな感じでログインできました。アップロードしてウェブが見れることも確認ができました。
利用者がTLSなどを使う設定をしてくるとは思えないので、特に今回はSSL等の設定をせずに完了としました。
セキュリティとしてはいまいちですが、この時代ではまだこの手が一般的かなと思っています。


【改訂履歴】作成:2015/03/29


【参照ページ】
小技Linux-CentOSでFTPサーバー構築(vsftpdをインストール)
【linux】vsftpd 導入手順(バーチャルユーザー版) at softelメモ
[CentOS][vsftpd]バーチャルユーザ運用する ごった煮 - tips about programming and building a server

 
Copyright © 1996,1997-2006,2007- by F.Kimura,