m6uのエンジニアっぽい日記

PHP利用開発やFuelPHP利用開発、PostgreSQL利用開発、Androidアプリ開発、CentOS7サーバー構築など、テクニカルでエンジニアっぽい内容の日記

CentOS7でSSH必須にしたあとに、個別ユーザーを絞ってパスワード認証を復活させる方法

背景

CentOS7サーバーを立てていて、古いシステムを移植しているのですが、FTP接続するのにSCP/SFTPでなくFTPを使わざるを得ない状況になり、急遽やり方を調べてみました。
なお、この記事については、teratailでの質問:「CentOS - CentOS7&Vsftpdで非SSHユーザーをFTPできるようにしたい(96994)」を再構成したものです。

SSH側とvsftpd側の両方で穴を開ける

なお、前提として、追加したユーザー名「foobarbaz」をグループ「web」に所属させています。

SSH(6.6.1p1-35.el7_3)側

定義ファイル「/etc/ssh/sshd_config」を点検して、ファイル末尾に「Match User foobarbaz」行を追加して、「PasswordAuthentication yes」を加えました。  こんな感じです↓

Match User foobarbaz
  PasswordAuthentication yes

vsftpd(3.0.2-21.el7)側

ユーザー定義用ファイルを置くディレクトリ「userconf」を「/etc/vsftpd」の下に作り:
「# mkdir /etc/vsftpd/userconf」
vsftpdの定義ファイル「/etc/vsftpd/vsftpd.conf」に下記の行を追加し
「user_config_dir=/etc/vsftpd/userconf」
そのディレクトリにfoobarbazというユーザー名そのもののファイル名で定義を
「local_root=/var/www/html/path/to/target/directory」
みたいにしました。
しかし、これだけでは足りず、ファイルを書き込んだり削除できるようにするのと、ルートディレクトリ書き込み権限問題の対策も入れて、最終的にはこうなりました:

write_enable=YES
allow_writeable_chroot=YES
local_root=/var/www/html/path/to/target/directory

rootディレクトリに書き込めるようにしたものの、そもそもlocal_rootの定義で実ルートディレクトリを操作できるようにしているわけでなく、web公開ディレクトリの奥底深くを指定しているので、rootディレクトリを書き込みできる状態になっていても問題ないのです。

それぞれサービスをリスタート

二つのサービスの定義ファイルをいじったわけなので、それぞれ再起動させます。
「# systemctl restart sshd
「# systemctl restart vsftpd」