«前の日記(2011-10-11 (Tue)) 最新 次の日記(2011-10-17 (Mon))» 編集

雑記帳


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を使う必要性がなくなったはず。