2月 18
2011

sftpにchrootdirectoryを適用するときに悩まないために for Leopard

2月 18th, 2011 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で(^_^;