sftpにchrootdirectoryを適用するときに悩まないために for Leopard
Snow Leopard に標準で付いているOpenSSHでsshサーバ運用しています。
そこで、第三者にsftpを提供することになったのですが、普通に提供すると他のディレクトリまで見えてしまいますね。パーミッションでがちがちにするのも良いのですが、抜けがあったりするとこれまた大変です。(^_^)
そこで、特定のユーザには chroot して、完全に隠蔽したsftp環境を提供しようという算段です。
最近にOpenSSHは標準で簡単にchrootの設定が出来ますのでこれはラッキー。(ちょっと前まで大変だったんですよ。。;p)
でも、sftpでchrootなんて皆さんやっていることですね。(^_^)
今回は、Mac の Leopard 環境でコマンドラインだけをもちいて、パスワード認証ではなくて、ちゃんと公開鍵を使う環境構築をやります。
何を言いたいのかというと、、、、
公開鍵を使って、なおかつ、chrootにて安全なsftp環境をユーザに提供する設定例です。
作業は、大体3つです。
1, ユーザの作成とホームディレクトの作成(鍵置き場)
2. chrootしてユーザに提供するsftp環境の作成
3. sshdの設定(sshd_config)
では、さっそく。。。
1. ユーザの作成とホームディレクトリの作成(鍵置き場)
Leopard では、ユーザの情報などはDirectry Serviceで行っております。なので、dsclコマンドを使います。dsclって覚えにくいですが、これはDirectory Service command lineの略ですね。
普段は /Users の直下にホームディレクトリを作成します。他のは書でも良いのですが、とりあえず、sftpuser という名前で作成しましょう。
まずは、利用されていないUID(UniqueID)とGID(PrimaryGroupID)を得ます。
$ dscl . -list /Users UniqueID
$ dscl . -list /Groups PrimaryGroupID
既に登録されているUIDやGIDが表示されます。まだ、登録されていない数字を選びます。今回はめんどくさいので両方とも600にします。
さあ、作成します。sudoコマンドにて実行してください。
$ sudo dscl . -create /Groups/sftpuser PrimaryGroupID 600
$ sudo dscl . -create /Users/sftpuser UniqueID 600
$ sudo dscl . -create /Users/sftpuser RealName Sftpuser
$ sudo dscl . -create /Users/sftpuser PrimaryGroupID 600
$ sudo dscl . -create /Users/sftpuser NFSHomeDirectory /Users/sftpuser
$ sudo dscl . -create /Users/sftpuser Password “*”
$ sudo /usr/sbin/createhomedir -b -u sftpuser
これで、ログインするためのユーザが作成されました。
2. chrootしてユーザに提供するsftp環境の作成
ユーザから何をされて良い環境、おっと、ユーザがいろいろファイルを置くための環境を作成します。
今回は、/Users/sftpwork を割り当てましょう。
ますはディレクトリを作成します。ただし、ココが重要。オーナはrootです、またパーミッションもrootさん以外は書き込みできないパミッションにします。
$ sudo mkdir /Users/sftpwork
$ sudo chown root:admin /Users/sftpwork
$ sudo chmod 755 /Users/sftpwork
/Users/sftpwork直下はsftpuserさんが書き込みできないので、sftpuserさんのオーナのサブディレクトリを作ってあげます。
たとえば、webページのドキュメントルートに指定してあげるなら /Users/sftpuser/docroot とか、ログファイルを提供してあげるなら、/Users/sftpuser/logs とか。ま、いろいろ考えられますね。
3. sshdの設定(sshd_config)
最後に、sshの設定です。
Leopardには、ssh(sftp)にOpenSSHがあらかじめインストールされています。ここでは、sftpuserさんに安全にsftpを提供するところだけ説明します。ご存じのように、/etc/sshd_config ファイルを編集します。パスワードで認証するのは心許ないので公開鍵でのみの認容にします。
sshd_config ファイルの最後に、
Match User sftpuser
ChrootDirectory /Users/sftpwork/
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
それから、Subsystem の記載の所を探して
#Subsystem sftp /usr/libexec/sftp-server
Subsystem sftp internal-sftp
というように、外部コマンドの/usr/libexec/sftp-serverを使用しないようにコメントアウトして、sshd組込のsftpサーバを利用する既述を追加します。もちろん、パスワード認証しないので、
PasswordAuthentication no
は、どこかに記載しておいてください。
さて、最後に公開鍵を設置します。
公開鍵は、もちろんユーザさんが作成します。作り方は、省略しますがssh_keygenコマンド作成できます。
公開鍵は、/Users/sftpuser/.sshディレクトリにauthorized_keysというファイルで保存します。その時、もちろんファイルのオーナはsftpuserさんですが、.sshディレクトリのパミッションは700、authorized_keysファイルのパミッションは600で無ければなりません。つまり、drwx——、-rw——- となります。
これで、安全にsftp環境を提供できるようになります。
しかし、、、私の環境ではこれではアクセスできませんでした。(^_^;
実は、次のようなエラーメッセージがサーバのログに出てました。
fatal: bad ownership or modes for chroot directory component “/”
なになに? /ルートのオーナがモードが変だと? たぶんに、パミッションが変なのでしょう。
“ls -al /” で調べると 確かに”/”(ここでは”.”ですね) にパーミッションのgroupとotherにw(書き込み)権限が付いてます。
sudo chmod go-w /
これで、/にはrootさん以外、書き込みできなくなりました。
結構、これに気が付くのに手間取ってしまったんですよ。同じ、事象の人の助けになれば幸いです。でも、sftp環境を他の人に提供している人なんてそんなに居ないか。。。それも、Macで(^_^;