SFTPユーザーを作成してファイル転送用に使用する

佐野

佐野 2015年9月2日

平文で送受信するFTPが心配という方のために(かどうかは、わかりませんが)、
今回は、SFTPでファイル転送を行うサーバーにする方法をまとめようと思います。

暗号化された通信にはFTPS(SSL暗号化方式のFTP)もありますが、
今回はSFTP(SSHと同じ方式の暗号化)の方法にしておきます。

ユーザー作成

ユーザーはいつも通り、「useradd」コマンドで作成します。
ユーザー名は今回、例として「hoge.com」とします。

useradd hoge.com

次に、ウェブサイト用として利用するため、「hoge.com」がアップロードしたファイルを
Apacheが動かせるようにします。

gpasswd -a apache hoge.com

「hoge.com」グループに「apache」ユーザーを配属させます。
これにより、パーミッションはグループに権限を与える事により、Apacheが動かせるファイルとなります。

作成したユーザーをSSHでログイン可能にする

ファイル転送用に「root」や「ec2-user」を、そのまま使うのは、いまいち安全ではありません。
ルートアカウントを使いまわし、いずれうっかりキー等が漏えいしたとなれば、目も当てられません。

特にAmazon Linuxの「ec2-user」の場合、
「home」ディレクトリにユーザー用ディレクトリが存在します。
もしそれのパーミッションをうっかり変更した場合、ルート権限を持つアカウントでログインできなくなり、
再度ログインできるようにするには、やや大掛かりな作業を踏む必要が生じます。

ちなみに、ログインできなくなる条件は、
ユーザーディレクトリ(「/home/ec2-user」など)のパーミッションを、
所有者以外に書き込み権限を与えたときです。
こうなると、パーミッションが緩すぎるという事で、ログインが拒否されてしまいます。

まずは、ユーザーディレクトリのパーミッションを変えないように気を付けながら、
ユーザーディレクトリ内に、「.ssh」ディレクトリを作成します。

cd /home/hoge.com
mkdir .ssh
chmod 700 .ssh

パーミッション設定も、お忘れなく。

次に、「hoge.com」用の秘密鍵を作成します。
そのためにはまず、秘密鍵を作成する対象ユーザーに切り替える必要があります。

sudo su - hoge.com

作業は先ほど作成した「.ssh」ディレクトリの中で行うといいでしょう。

cd .ssh
ssh-keygen -t rsa

1回目には作成するキーの名前を指定します。
デフォルトでは「id_rsa」になります。
後で変更する事も可能なので、空Enterのデフォルトで問題ありません。

2回目にはログイン用パスワードを聞かれます。
これは任意で、秘密鍵の他に手打ちパスワードを設定できます。
空Enterで設定せずに進む事も可能です。

3回目にはパスワードの確認です。
パスワードを設定していなければ、空Enterで進みます。

そして、rootに戻ります。

exit

これで、ふたつのファイルが生成されます。

  • id_rsa : SSH接続に使用する秘密鍵(接続元で使用)
  • id_rsa.pub : サーバーに配置しておく公開鍵

秘密鍵「id_rsa」のほうを、ローカルのPC側でサーバーログイン時に使用します。
公開鍵「id_rsa.pub」は、鍵穴のようなものなので、サーバー側に置いておきます。

公開鍵の名称とパーミッションの変更を行います。

mv id_rsa.pub authorized_keys
chmod 600 authorized_keys

基本的には、「authorized_keys」という名称で公開鍵として認識されます。

次に、接続元側に、秘密鍵を保存しますが、単に秘密鍵をテキストとして保存するだけです。

cat id_rsa

「cat」コマンドで開いて、コピペで保存します。
ファイルの拡張子は何でもいいですが、利便性のため、「.pem」拡張子にするのもいいでしょう。

以上の作業の時点で、「hoge.com」でログイン可能なはずです。

もしログインが出来ないという場合は、公開鍵の名称書式が異なっている場合があります。
viで「/etc/ssh/sshd_config」AuthorizedKeysFileを開き、以下の「AuthorizedKeysFile」の行を探してください。

AuthorizedKeysFile .ssh/authorized_keys

右側にあるのが、公開鍵の識別名称で、もし違っていたら、公開鍵の名前をそれに合わせて改名、
もしくは「/etc/ssh/sshd_config」に「AuthorizedKeysFile」の行がなければ追加します。

新規SSHユーザーを作成する方法は以上です。
他にも「sudo」を可能にする設定方法もありますが、今回のファイル転送用には必要ないので省きます。
逆に、ファイル転送専用に使い、管理権限を与えないという場合には、以下の設定に続きます。

SFTP専用ユーザーにする

「hoge.com」を、ファイル転送専用ユーザーにします。

「/etc/ssh/sshd_config」を編集します。

以下の「Subsystem」の部分を変更します。

# override default of no subsystems
Subsystem sftp /usr/libexec/openssh/sftp-server

  ↓

# override default of no subsystems
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp

ファイルの末尾に、以下を追記します。

Match User hoge.com
    	ChrootDirectory /home/hoge.com
    	ForceCommand internal-sftp

対象ユーザーが他にもあれば、同じように続けて追記していきます。

続いて、「/home/hoge.com」ディレクトリの所有者とパーミッションを、以下のように変更します。

chown root:root /home/hoge.com
chmod 755 /home/hoge.com

一見すると、かなり思い切った設定ですが、こうする事により、
「hoge.com」ユーザーは、ユーザーディレクトリより上層を見る事はできなくなります。

Apacheの動作に関しましては、このディレクトリはまず「その他」の「実行」権限で通過し、
さらに奥のディレクトリやファイルが、グループに対して権限を与えられていればApacheは動作します
(先述通り、対象ユーザーのグループに「apache」を所属させている場合)。

さらに、ユーザーディレクトリ内にディレクトリを作成し、ユーザーに所有させます。

mkdir public_html
chown hoge.com:hoge.com public_html
chmod 775 public_html

ディレクトリの名前は任意です。
「/home/hoge.com」ディレクトリは「root」に所有させており、パーミッションも755であるため、
ユーザー「hoge.com」では編集できません。

しかし、その中に作成し、「hoge.com」に権限を持たせたディレクトリであれば、
ファイルアップロードも可能なので、このディレクトリにアップロードしていく事になります。

これで、sshdを再起動する事で、設定が反映されます。

sshd -t
(テストコマンドで何もエラーが出なければ再起動)
service sshd restart

ちなみにこの再起動は、「/etc/ssh/sshd_config」ファイルを編集しない、ユーザー作成の段階では必要ありません。

これで「hoge.com」ユーザーは、自分のユーザーディレクトリから上層には進めなくなりました。

ただし、コマンドラインからログインしようとすると、以下メッセージが出て失敗します。

This service allows sftp connections only. 
Connection to (IPアドレス) closed.

ファイルアップロードに使うだけなら、必要はないので、これで正常です。

代わりに、WinSCP等のソフトで秘密鍵を用いてSFTPでログインします。
20150902142655

設定画面で、秘密鍵を指定します。
WinSCPなど、ソフトウェアによっては、「.pem」形式から「.ppk」形式に変換する必要があります。
20150902155403

ログインができれば成功です。
20150902143358

これで、SSHと同じ暗号化方式で、従来のデフォルトFTPと同様に扱えるようになりました。

コンテンツは「public_html」の中で作成する事になります。
「.ssh」ディレクトリと、その中身のパーミッションを変更しないようにはご注意ください。

アップロードしたファイルの所有者は、現在ログイン中のユーザーとなり、
何も特別な設定をしていなければ、PHPによって生成されるファイルの所有者は「apache」となります。
「apache」所有のファイルは、所有者とグループ、パーミッションの変更はできませんが、削除はできます。
この辺りは従来のFTPなどと変わりないと思います。

ただし、ポートは22番を開放しておかないといけません。
全開放していると、rootアカウントも狙われる可能性があるため、
接続する端末を検討しながら、開放するIPアドレスを個別に設定していくとよいでしょう。
ユーザーなどの何らかの条件ごとに、ポートを変える方法があれば、より好都合なのですが・・・

しかし、どんなに通信を暗号化していようが、
秘密鍵が漏洩したり、PCがウィルスに感染するような事があれば、元も子もありません。
ましてや、秘密鍵をUSBメモリに保存して、そのUSBメモリを紛失したり、
不信なメールも平気で開くようであれば、なおさらです。
暗号化により安全になるのではなく、結局は利用者のリテラシーに依存するものです。