SFTPユーザーを作成してファイル転送用に使用する
平文で送受信する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でログインします。
設定画面で、秘密鍵を指定します。
WinSCPなど、ソフトウェアによっては、「.pem」形式から「.ppk」形式に変換する必要があります。
これで、SSHと同じ暗号化方式で、従来のデフォルトFTPと同様に扱えるようになりました。
コンテンツは「public_html」の中で作成する事になります。
「.ssh」ディレクトリと、その中身のパーミッションを変更しないようにはご注意ください。
アップロードしたファイルの所有者は、現在ログイン中のユーザーとなり、
何も特別な設定をしていなければ、PHPによって生成されるファイルの所有者は「apache」となります。
「apache」所有のファイルは、所有者とグループ、パーミッションの変更はできませんが、削除はできます。
この辺りは従来のFTPなどと変わりないと思います。
ただし、ポートは22番を開放しておかないといけません。
全開放していると、rootアカウントも狙われる可能性があるため、
接続する端末を検討しながら、開放するIPアドレスを個別に設定していくとよいでしょう。
ユーザーなどの何らかの条件ごとに、ポートを変える方法があれば、より好都合なのですが・・・
しかし、どんなに通信を暗号化していようが、
秘密鍵が漏洩したり、PCがウィルスに感染するような事があれば、元も子もありません。
ましてや、秘密鍵をUSBメモリに保存して、そのUSBメモリを紛失したり、
不信なメールも平気で開くようであれば、なおさらです。
暗号化により安全になるのではなく、結局は利用者のリテラシーに依存するものです。