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

#概要
・VPN越しに社内のファイルサーバーにファイルをアップロードすることを想定
・vsftpdをインストールし、アップロード用のアカウントを作成した
・通信を試みたものの500 OOPSのエラーが出て通信が全然できなかった
・当該エラーでググるとSELinuxの設定を弄ればOKとあった
・しかしSELinuxはdisabled状態だったので意味がなくハマった
・海外サイトでいろいろ調べた結果、ディレクトリのパーミッションによるものだとわかった
・ftpでファイルを置くディレクトリ（親も含める）を777にすると開通した

#復習～ディレクトリをホームディレクトリ以外にする方法～
###mkdir 1
```/etc/
$sudo mkdir /etc/vsftpd/
```
###mkdir 2
```/etc/vsftpd/
$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ファイル
```/etc/vsftpd/user_conf/username
local_root=/drv2/dir1/dir2/
```
user_confディレクトリの中にtouchまたはviでファイルを作成し、その中にlocal_rootを記述します。このときファイル名に拡張子はつけず、ftpにログインを許可するユーザー名と同じファイル名にするのがポイント

###chroot_list
```/etc/vsftpd/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](https://qiita-image-store.s3.amazonaws.com/0/146880/15ec9d27-1bc7-eecc-8145-8c1c588f2cc9.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」の原因と解決方法](http://nobuneko.com/blog/archives/2013/05/linux_centos_6_ftp_500_oops_cannot_change_directory.html)
[vsftpdサーバーに接続できない場合](http://www.pasokuma.net/linux/server/ftpd/vsftpd/vsftpdconnect.html)
などを参考にするも、そもそも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) の設定](http://park12.wakwak.com/~eslab/pcmemo/linux/vsftpd/vsftpd3.html)
local_umask=022（デフォルト）で設定しているとディレクトリパーミッションは777じゃないと通らないようです。

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