IMPOV::In My Point Of View

仕事、SEO、ウェブマーケティング、時事問題、健康、生き方などなど、書きたいことを勝手に書き倒しているブログです。とどのつまり「便所の落書き」

SFTP用ユーザーの追加と管理方法(初心者がさくらのVPSを立ち上げるまで - その9)

(2015/04/02 追記:chrootを設定する例を追加しました。SFTP用ユーザーを、chrootでアクセス可能範囲を限定する(さくらのVPS))

悩ましい複数のSFTPアカウントの設定と管理

仕事でウェブサーバーを使用するとなると、社員や外部の協力者にFTPアカウントを一時的に提供し、ウェブサイトの構築を手伝ってもらうことがしばしばある。

毎回、新しいアカウントを作成して鍵を発行してもよいのだが、アップロードされるファイルの所有者がそれぞれ違うと、パーミッションを604とか644にされてしまった場合、わざわざroot権限を引っぱり出さないといけないのでとても面倒だ。

一方で1つのアカウントを共有すると、アクセスを制限したいユーザーが出るたびに、公開鍵を新しいものに差し替え、新しい秘密鍵の配布をしなければならない。

そこで、入門OpenSSH / 第5章 より安全に運用するためにを参考にして以下の様な方法を取ることにした。

実現する環境

  • SFTPユーザーが公開ディレクトリのファイル類を操作できる。*1
  • SFTP使用者毎に鍵を発行する。*2
  • SFTP以外へのログインを許さない。
  • パスワードログインを許したくないのでFTPはインストールしない。

基本的な構成

  1. SFTPアカウントは apache グループに所属させる。*3
  2. ファイル書き込み時のデフォルトパーミッションを664に設定する。*4
  3. SFTPアカウントは一つのみ作成し、公開鍵と秘密鍵のペアを必要な人数分用意する。*5
  4. 公開鍵にコマンドを設定しSFTP以外の接続を拒否する。*6

こうすることで、SFTPでログインしたユーザーは公開ディレクトリ以外のディレクトリ構造やファイルなどを見ることはできるものの、システム関係のファイル群は原則として root:root(所有者:グループ) となっているので削除したり改変したりすることはできない。

開示したくないディレクトリを隠すためには、chroot を設定すると良いとの記事を何件か読んで検討したが、所有権などが複雑になりそうなので今回は採用しなかった。*7

ディレクトリ・ファイルの所有権およびパーミッションの設定

公開ディレクトリの所有者とグループを apache:apache に変更

#公開ディレクトリの権限変更の例
chown -fR apache:apache /var/www/hoge.com/public_html

全ての公開ディレクトリについて、それ以下のディレクトリまで含め再帰的に所有権の変更を行う。*8

umaskを設定し、デフォルトパーミッションを664にする。

umaskを指定することで、デフォルトパーミッションを変更することができる。ここでは、664 としたいので、002 を設定する。*9

SFTPによる接続に対するumaskの設定
vim /etc/ssh/sshd_config

#以下の行を探しだして修正する。
Subsystem       sftp    /usr/libexec/openssh/sftp-server
↓
Subsystem       sftp    /usr/libexec/openssh/sftp-server -u 002
apacheの書き込みに対するumaskの設定
vim /etc/sysconfig/httpd

#以下の行を追加する
umask 002
設定の適用

それぞれ再起動して設定を適用する。

service sshd restart
service httpd restart

これで、MovableTypeなどが生成するページ(apache:apache)やSFTPユーザーがアップロードするファイル類(user:apache)のグループが同じ apache となり、また、グループによる書き込みが許された状態になるので、公開ディレクトリのすべてのファイルについて消去・上書き・移動などをSFTPクライアント上からできるようになる。

SFTP用アカウントの作成と鍵の設定

アカウント作成

この記事では、作成するアカウント名を sftp-usr とする。*10
また、このアカウントは apache グループに所属させる。

useradd -g apache sftp-usr
passwd sftp-usr

鍵ペアの作成

準備

まずはroot権限で、シェルでアクセスしようとした時に接続を遮断するスクリプトを作成する。*11

vim /usr/libexec/openssh/force-sftp-server.sh

#以下のコードを貼り付けて保存(この下の行から)
#!/bin/sh
if [ "/usr/libexec/openssh/sftp-server -u 002" != "$SSH_ORIGINAL_COMMAND" ]; then
  echo "Sorry, only sftp is permitted."
  exit 1
fi
exec /usr/libexec/openssh/sftp-server
#ここまで

#実行権限を付与
chmod +x /usr/libexec/openssh/force-sftp-server.sh

root権限から sftp-usr にログイン。*12
HOMEに移動して鍵を保存するためのディレクトリと公開ディレクトリへのシンボリックリンクを作成する。*13

cd $HOME
mkdir .ssh
chmod 700 .ssh

ln -s /var/www www
鍵の作成(ここから繰り返しゾーン*14

鍵を作成し、編集を行う。

#鍵の作成
ssh-keygen -t rsa

#できた鍵を編集
vim ~/.ssh/id_rsa.pub

#以下のとおり先頭にコマンドを追加し、ユーザー名を変更する(全てを改行無しの1行のみで書く)
ssh-rsa AAAAB3Nza~(中略)~gV/BwQ== sftp-usr@admin.hoge.com
↓
command="/usr/libexec/openssh/force-sftp-server.sh",no-pty,no-x11-forwarding,no-port-forwarding,no-agent-forwarding ssh-rsa AAAAB3Nza~(中略)~gV/BwQ== ユーザー名

#ユーザー名のところをわかりやすい名前にしておくと後で削除するときに便利

このように編集した公開鍵を名前を変更して保存する。

mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys #mvを使うのは初回のみ
chmod 600 ~/.ssh/authorized_keys

あとは、秘密鍵をダウンロードして削除。TeraTermのメニューから、[ファイル]-[SSH SCP...] を選択し、Recieve 欄で /home/sftp-usr/.ssh/id_rsa をダウンロードする。

#サーバー上の秘密鍵を消す
rm /home/sftp-usr/.ssh/id_rsa

ダウンロードした秘密鍵には、ファイル名にユーザー名をいれておく。

二人目以降の公開鍵は編集後にcatコマンドで追加し、編集元ファイルは削除する。

#二人目以降の公開鍵の追加
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
rm ~/.ssh/id_rsa.pub

注意点

実は、ここまでのやり方だと、SFTPでログインしたユーザーがSFTPクライアントから公開鍵を直接いじることができる。したがって、悪意のあるユーザーがいた場合、公開鍵のコマンド部分を変更してシェルへのログインができるようにすることもできる。

より厳密に行うのであれば、公開鍵の所有権をrootに変更しパーミッションを404にするなど、追加の対応が必要だ。

chown root:root /home/sftp-usr/.ssh/authorized_keys
chmod 404 /home/sftp-usr/.ssh/authorized_keys

なお、今回は信頼できる相手にのみ SFTPアカウントを提供するので、この程度にとどめておく。

ユーザーの削除

ユーザーの削除は、authorized_keys を開き、そのユーザーの行を削除する。

目次

一連の記事の目次は、以下のページにあります。
初心者がさくらのVPSを立ち上げるまで - その1

*1:所有権およびパーミッションの適切な設定

*2:個人毎にアクセスの可否をコントロール

*3:アプリケーションが作成するファイルは、apacheが所有者およびグループになるので、ユーザーもこのグループに所属させる。

*4:グループに書き込みの権限を与えることで、apacheと複数のユーザーが互いにファイルの削除や追加を自由にできるようになる。

*5:複数の公開鍵を1つの鍵ファイルに連記することで、アカウントが1つであっても、それぞれの鍵ごとに認証を行うことができる。また、誰がファイルをアップロードしても、所有者は必ずこのアカウントになるのでファイル操作でトラブルが無い。

*6:公開鍵の冒頭にコマンドを書き込むことで、ログイン時の動作を制限することができる。

*7:実験すらしていません。

*8:VirtualHostの記事などで、何の説明もなく chown -R apache:apache としていたのは、この環境を実現するためです。

*9:666 - 002 = 664

*10:好きなアカウント名にしてください。

*11:sftpのアクセスのみを通過させる。

*12:実際には、作業用アカウント → root → sftp-usr と遷移してくる

*13:シンボリックリンクの作成は、初めてSFTPログインした人が公開ディレクトリへすぐに移動できるようにするためなので、必須ではありません。

*14:ユーザーが増えるごとにここから繰り返す