Linux
ftp
vsftpd

vsftpdのftpサーバーログインでハマった件


概要

・VPN越しに社内のファイルサーバーにファイルをアップロードすることを想定

・vsftpdをインストールし、アップロード用のアカウントを作成した

・通信を試みたものの500 OOPSのエラーが出て通信が全然できなかった

・当該エラーでググるとSELinuxの設定を弄ればOKとあった

・しかしSELinuxはdisabled状態だったので意味がなくハマった

・海外サイトでいろいろ調べた結果、ディレクトリのパーミッションによるものだとわかった

・ftpでファイルを置くディレクトリ(親も含める)を777にすると開通した


復習~ディレクトリをホームディレクトリ以外にする方法~


mkdir 1

$sudo mkdir /etc/vsftpd/


mkdir 2

$sudo mkdir user_conf

いくつかファイルを置くので専用のディレクトリをetc配下に切ります。

ちなみにmkdirしたときに生成されるディレクトリのパーミッションはdrwxr-xr-x(755)

ちなみにさらにuser_confディレクトリを切ったのは後述する別ユーザのルートディレクトリを変えるためです。


vsftpd.conf

listen=NO

listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
ascii_upload_enable=YES
ascii_download_enable=YES
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
ls_recurse_enable=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
seccomp_sandbox=NO
pasv_enable=YES
user_config_dir=/etc/vsftpd/user_conf


usernameファイル

local_root=/drv2/dir1/dir2/

user_confディレクトリの中にtouchまたはviでファイルを作成し、その中にlocal_rootを記述します。このときファイル名に拡張子はつけず、ftpにログインを許可するユーザー名と同じファイル名にするのがポイント


chroot_list

username

vsftpd.confでchroot_local_user=NOとしていることで、chroot_listに書かれたユーザーは、対象ディレクトリ以外が閲覧できない→ffftpを使うと対象ディレクトリの上の階層以上が表示されないようになります。


/home/

mkdir username

これがポイント。vsftpdでは一度、homeディレクトリ以下にあるユーザー名のディレクトリを参照してからでないとlocal_rootを参照してくれないらしいです。これがわからずに最初にハマったとこでした。

通常のlinuxでは既にユーザー名のディレクトリが/home配下にあるので意識していませんでした。


パーミッションの整理

対象ディレクトリ
パーミッション
経由ディレクトリ
パーミッション

/drv2
drwxr-r-x(755)
/home/username/
drwxr-r-x(755)

/drv2/dir1
drwxr-r-x(755)
-
-

/drv2/dir1/dir2
drwxr-r-x(755)
-
-


そして、エラーが出る

エラー.png

以上の設定でftp接続したら、



500 OOPS: cannot change directory:/drv2/dir1/dir2



という感じでエラーが出ました。

Linux(CentOS 6) - FTP接続時のエラー「500 OOPS: cannot change directory」「500 OOPS: priv_sock_get_cmd」の原因と解決方法

vsftpdサーバーに接続できない場合

などを参考にするも、そもそもSELinuxがDisabledになっているので意味がありません。


でいろいろやった結果、、、

パーミッションが777だといける!

対象ディレクトリ
パーミッション
経由ディレクトリ
パーミッション

/drv2
drwxrwrwx(777)
/home/username/
drwxr-r-x(755)

/drv2/dir1
drwxrwrwx(777)
-
-

/drv2/dir1/dir2
drwxrwrwx(777)
-
-


後日談

ちゃんと調べたらありました。

FTPサーバ (vsftpd-2.0) の設定

local_umask=022(デフォルト)で設定しているとディレクトリパーミッションは777じゃないと通らないようです。

こんなのに半日費やしました。。。トホホ