雑記帳
2011-10-13 (Thu) [長年日記]
■ [Apache] 特定のディレクトリだけ認証を外す
Apacheで、サイト全体をBASIC認証などでアクセス制限を行っているときに、一部のディレクトリ以下のみ、認証の対象外にしたい場合には、以下のようにすれば良い。
たとえば、/var/www/default/html以下すべてがBASIC認証によって制限されていて、/var/www/default/html/noauth以下は認証なしにしたいような場合は、下記のように設定すればよい。
# 全体に対してBASIC認証の設定 <Directory /var/www/default/html> Options FollowSymLinks AllowOverride None Order allow,deny Allow from all AuthType Basic AuthName welcome AuthUserFile /var/www/default/.htpasswd require valid-user </Directory> # /var/www/default/html/noauth/ ディレクトリだけ認証の対象外にする <Directory /var/www/default/html/noauth> Order allow,deny Allow from all Satisfy Any </Directory>
Satisfyディレクティブは、ホストレベルの認証と、ユーザレベルの認証の組み合わせ方法を指定するディレクティブで、anyにすることで、ホストレベル認証とユーザレベル認証のどちらかの認証が通れば許可することができる。それとは逆に、Allに設定すると、それらすべての認証を通る必要がある(Satisfy Allがデフォルト)。
上記の設定だと、BASIC認証が設定されているが、ホストレベルの認証ですべてが許可されているので、BASIC認証による制限はかからないことになる。
■ [Linux][ssh] sftpでchrootする
これまではchrootが必要なケースではftpを使ってきていたのだが、opensshも4.9からchrootに対応しているということもあり試してみた。
今回は、特定のユーザのみchrootする設定。想定としては、Webサーバの公開領域のうち、特定のディレクトリ以下にのみアクセス可能なアカウントとする。具体的には、以下のような条件となる。
- ドキュメントルートは、/var/www/html
- chrootしたいディレクトリは、/var/www/html/path/to/upload
- upload_userというアカウントのみ、chrootするものとする
- upload_userは、sftpのみ使用可能とする
- その他のアカウントはchrootせずに、/var/www/html以下が読み書き可能
実際にやってみると、この条件を満たすのは意外と難しかった。
ユーザ作成
ユーザは普通に作れば良い。公開鍵認証を使いたいので、ssh-keygenで鍵を作っておく。
ディレクトリを作成
/var/www/html/path/to までディレクトリを作成する。この時、uploadディレクトリは作らない。 また、/var/www/chroot/upload までディレクトリを作成する。この時、/var/www/chrootまでは、所有者:グループをroot:root、パーミッションを755としておかなければならない。この条件があるため、通常のドキュメントルート以下にchrootするのが難しい。 uploadディレクトリは、upload_userや、その他のアカウントが読み書きできる所有者、グループ、パーミッションとする。
/var/www/html/path/to に、/var/www/chroot/uploadのシンボリックリンクを作成する。
sshd設定
/etc/ssh/sshd_configの設定を変更する。
まず、Subsystemを以下のように変更する。
Subsystem sftp internal-sftp
次に、下記の設定を追記する。
Match user upload_user ChrootDirectory /var/www/chroot X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp
このMatch userの設定で、upload_userのみ、/var/www/chrootにchrootするようになる。他の設定は、sftpのみ使えるようにするために必要なもので、chrootとは直接関係ない。
sshdを再起動して設定を反映させる。
これで、upload_userでsftpで接続すると、/var/www/chrootにchrootされた状態で接続できる。/var/www/chroot自体は、パーミッションの関係で書き込みができないが、その下にあるuploadディレクトリには書き込みができる。
また、他のアカウントについては、シンボリックリンクである/var/www/html/path/to/upload経由で読み書きができる。
これで、openssh 4.9以降の環境であれば、FTPを使う必要性がなくなったはず。