行動すれば次の現実

ほどよくモダンなシステム開発を目指しています。メインテーマは生産性、Ruby、Javascriptです。

外注向けに特定ディレクトリのみ参照できるFTPユーザーを作成する方法 | ConoHa VPS+CentOS+vsftpd

外注先や他社とFTPを介してファイルを送受信する場合に、FTP専用のユーザを作成して共有する事があるかと思います。 その際、FTP専用ユーザーがサーバー内の全てのディレクトリにアクセスできるのはセキリティ上、好ましく有りません。

本記事では、「特定のディレクトリ配下のみアクセスできる」かつ「シェルにはログインさせない」FTP専用ユーザーの作成方法を解説します。

環境情報

  • サーバー:ConoHa VPS
  • OS: CentOS 9

FTPサーバーの設定

ConoHa VPSのCentOSサーバーにはFTP(vsftpd)はインストールされていませんので、インストールや諸々の設定を行います。

FTPサーバーのインストールと起動サービスの登録

# rootでログイン
sudo yum install -y vsftpd
sudo systemctl enable vsftpd
sudo systemctl start vsftpd
sudo systemctl status vsftpd

# FTPユーザでアクセス可能とさせるディレクトリを作成
mkdir -m 777 /var/www/ftp_dir

# vsftpdの設定のために作成
touch /etc/vsftpd/chroot_list
mkdir /etc/vsftpd/user_conf

vsftpd.confの設定

  • vsftpd.confは以下の通り設定しております。
vi /etc/vsftpd/vsftpd.conf

vsftpd.confの設定内容

# 匿名ユーザのログインは許可しない
anonymous_enable=NO
# ローカルユーザによるログインを許可
local_enable=YES
# ファイルに変更を加える FTP コマンドの使用を許可
write_enable=YES
# ディレクトリ=755、ファイル=644
local_umask=022
# ログを取得する
xferlog_enable=YES
# ログの出力先
xferlog_file=/var/log/xferlog.log
connect_from_port_20=YES
# ユーザのchroot(ユーザーごとのルートディレクトリ)を有効にする
chroot_local_user=YES
# chroot_listの設定
chroot_list_file=/etc/vsftpd/chroot_list
# chroot_listにリストアップしたユーザーはchrootの対象から除外される
chroot_list_enable=YES
# IPv4で動作させる
listen=YES
# IPv6で待機しない
listen_ipv6=NO
# パッシブモードを有効
pasv_enable=YES
# IPアドレス
pasv_address=【FTPサーバーのIPアドレス】
# PASVで使用するポートの最小番号
pasv_min_port=60001
# PASVで使用するポートの最大番号
pasv_max_port=60010
# ls時にドットファイルを含む
force_dot_files=YES
# ファイルのタイムスタンプはユーザのローカルタイムを使用する
use_localtime=YES
# ユーザ毎の設定ファイルを置くディレクトリ
user_config_dir=/etc/vsftpd/user_conf
# 書き込み権限があるとchroot出来ない機能を無効にする
allow_writeable_chroot=YES

ファイアウォールの設定

  • 初期状態ではFTPはファイアウォールでブロックされてしまいますので、設定を変更します。
# FTPを開放
firewall-cmd --add-service=ftp --permanent

# Passive用ポートの開放
firewall-cmd --zone=public --add-port=60001-60010/tcp --permanent

# ファイアウォールの再起動
firewall-cmd --reload

サーバーの設定

  • 後述の-s /sbin/nologin指定によるユーザ作成をすると、CentOS 7以上だとFTP接続時に「530 Login incorrect.」で失敗してしまいます。 そのため以下の設定変更をする必要があります。
# rootでログイン
vi /etc/shells

# 下記を追記して保存します
/sbin/nologin

こうすることで、nologin を指定したユーザーでもFTP接続できるようになります。

FTPユーザの作成

① FTPユーザを作成する
# rootでログイン
useradd -s /sbin/nologin ftp-user
  • -s /sbin/nologin ログインシェルを実行させないための指定です。これによりsshによるログインが不可となります。
② パスワードの設定
passwd ftp-user
  • 任意のパスワードを設定します。
③ ftp-userのuser_confを配置
# rootでログイン
vi /etc/vsftpd/user_conf/ftp-user

# 下記を追記して保存
local_root=/var/www/ftp_dir
  • こうすることで、local_rootに指定したディレクトリがftp-userのルートディレクトリになります。

接続確認

以上でFTPユーザの作成が完了しました。最後に接続確認を行います。

FTPで接続確認

ftp-user@XXX.XXX.XXX.XXX
230 Login successful.
ftp>
  • 無事接続が成功し、ftpコマンドが使用可能となります。

SSHで接続確認

ssh ftp-user@XXX.XXX.XXX.XXX

This account is currently not available.
  • nologinの設定により、ログインシェルは無効となります。