2015年4月29日水曜日

Apache2のセキュリティ設定(基本)

■ヘッダ情報削減
・HTTPレスポンスヘッダのサーバ情報を減らす
 /etc/apache2/conf-available/security.conf

ServerTokens OS →  ServerTokens Prod
ヘッダにApacheやOSのバージョン情報を入れない

・ヘッダ識別子非表示
 ServerSignature On  →  ServerSignature Off

■Apacheトップページの非表示
http://ドメイン名/ で表示されるApacheのサンプルページの非表示

/etc/apache2/conf-available/security.conf

<Directory />
  AllowOverride None
  Order Deny,Allow
  Deny from all
</Directory>

これがコメントアウトされていたらはずす。無ければ追記

[Ubuntu] Gitolite3 + Apache2 + SSLクライアント認証

■目的
自分で立てたgitサーバーに対してhttps プロトコルでクライアント認証アクセスする

■インストール
Apache2はインストール済みとする

・Gitolite3インストール
  apt-get install gitolite3
 インストール中に管理者の公開鍵パスを要求されるので適当にSSHログインできる公開鍵を指定する
 →これは後で変更も可能なので適当でOK

 インストールが完了するとGitolite3のファイル群は /usr/share/gitolite3
 環境は /var/lib/gitolite3 に作成される。

■Apache2準備
まずはApache2の準備

・ apache-suexec-custom のインストール
   apt-get install apache-suexec-custom
   a2enmod suexec

・mod_cgid 有効化
  a2enmod cgid

・gitolite ラッパースクリプト用意
  DocumentRoot が /var/www だとしたら /var/www/git というフォルダを作成する。
  ここにスクリプトを追加する。  gitolite-suexec-wrapper.sh とする。
 →スクリプトを置くフォルダは/var/www/git でなくても良いが、DocumentRootで指定したフォルダのサブフォルダでないとsuexecがスクリプトを実行できないので注意

(gitolite-suexec-wrapper.sh)
===============================================================================
  #!/bin/bash

  export GIT_PROJECT_ROOT="/var/lib/gitolite3/repositories"
  export GITOLITE_HTTP_HOME="var/lib/gitolite3"

  exec /usr/share/gitolite3/gitolite-shell
===============================================================================

  chown gitolite3:gitolite3 gitolite-suexec-wrapper.sh
  chmod +x /var/gitolite/gitolite-suexec-wrapper.sh

  として所有者、実行権限を変更する。

・SSLクライアント認証設定
  VirtualHost の設定に以下を追加

===============================================================================
SSLEngine on
SSLCertificateFile <サーバー証明書のパス>
SSLCertificateKeyFile <サーバ秘密鍵のパス>
SSLCACertficateFile <CA証明書のパス>
SSLVerifyClient require
SSLUserName SSL_CLIENT_S_DN_CN

SuexecUserGroup gitolite3:gitolite3
ScriptAlias /git /var/www/git/gitolite-suexec-wrapper.sh

<Location /git>
    Order allow,deny
    Allow from all
</Location>
===============================================================================

CAはオレオレCAで良い。SSLUserName設定はクライアント証明書のCNをユーザー名として扱うことの宣言。
環境変数REMOTE_USERもこれによって証明書CNに置き換わる。

■Gitolite3準備
次にGitolite3側の準備

・リポジトリアクセス権設定
Gitolite3のインストールによってgitolite-admin リポジトリが自動で生成されているはず。
まずはこれをローカルでclone する。そして conf/gitolite.conf を編集する。
例えばtesting リポジトリの設定が以下のようになっていたら

repo testing
    RW+    = @all



repo testing
    RW+    = @all
    R        = daemon

というようにdaemonユーザーに対してRead権限を付与する。こうしないとApacheからGitolite3管理のリポジトリが読み出せない。Apacheからアクセスしたい全てのリポジトリにR = daemonを付与する。
変更したらcommit, push して反映

また当然であるが、クライアント証明書のCNと同じ名前のアクセス権限がリポジトリに設定されている必要がある。例えば、developというメンバーがクライアント認証でアクセスする場合にはtesting リポジトリの例で言うと

repo testing
    RW    = develop
    R      = daemon

とする。このときtestingリポジトリにApacheからはクライアント証明書のCNがdevelopでないとリポジトリにアクセスできない。

■クライアント側設定
・git設定ファイルの変更
(Linux)
    ~/.gitconfig

(Windows)
    C:/Users/<ユーザー名>/.gitconfig

以下の設定を追記する
===============================================================================
[http]
sslCert = <クライアント証明書ファイルパス>
sslKey = <クライアント秘密鍵ファイルパス>
sslCaInfo = <CA証明書ファイルパス>
sslVerify = false
===============================================================================

最後のsslVefiry = false はオレオレCAの場合に必要。ちゃんと認証機関からCA証明書を取得しているなら不要。

■実行
以上の設定が完了していれば以下のコマンドでリポジトリの取得が可能なはず。

git clone https://<ドメイン名>/git/<リポジトリ名>