Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

概要

・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じゃないと通らないようです。

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

goppy001
少し遅めの新米エンジニア/ほぼ独学で学習中/好きな食べ物はプリン/ruby/rais/python/MySql/VBA/シェル
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away