プロジェクト

全般

プロフィール

Redmineでセキュアなログイン

はじめに

RedmineをHTTPで運用すると、ログイン時のパスワード送信がBasic認証となるため、ネットワーク上をパスワードが平文で流れます。Redmineサーバーがインターネット上にある場合などは、ログインをセキュアにすべきです。

セキュアにする方法

セキュアにする方法としては次が考えられます。

  • Redmineサイト全体をHTTPSでアクセスする
  • Redmineの特定のアクセスだけをHTTPSとし、それ以外はHTTPとする

認証(ログイン)に関する情報を保護するだけなら後者でもよさそうですが、クッキーなど認証後の情報を保護するには前者が必要です。

最初に、SSLサーバー証明書の準備

自己証明書

しかるべきSSLサーバー証明書を用意できない場合、自己証明書を作成します。自己証明書だと、Webブラウザからアクセスする際にセキュリティ警告(信頼できない証明書)が出てしまいます。

CentOS 6で自己証明書を作成

# openssl req -new -newkey rsa:2048 -sha1 -x509 -nodes -set_serial 1 -days 10950 \
-subj "/C=JP/ST=Tokyo/L=Chiyoda Ward/CN=www.example.com" \
-out /etc/pki/tls/certs/www.example.com.crt \
-keyout /etc/pki/tls/private/www.example.com.key

SSL証明書

PKCS#12形式の証明書から、PEM形式の証明書および鍵ファイルを取り出す

~$ openssl pkcs12 -nokeys -in torutk_com_cert-key-bundle.p12 -out torutk_com-cert.pem
~$ openssl pkcs12 -nocerts -nodes -in torutk_com_cert-key-bundle.p12 -out torutk_com.key
  • Nginxは証明書チェーンを受け入れられないという情報もあり(要検証)、PKCS#12形式から取り出したCERTファイルではなく、入手した証明書を指定する必要があるとのこと

Redmineサイト全体をHTTPSでアクセスする

使用しているWebサーバーの設定をHTTPSにします。

/etc/nginx/conf.d/redmine_ssl.conf

upstream unicorn-redmine {
    server unix:/tmp/unicorn_redmine.sock;
}

server {
    listen 443;
    server_name _;

    ssl on;
    ssl_certificate /etc/pki/tls/certs/server.crt;
    ssl_certificate_key /etc/pki/tls/certs/server.key;
#    ssl_session_timeout 5m;
#    ssl_protocols SSLv2 SSLv3 TLSv1;
#    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
#    ssl_prefer_server_ciphers on;

    root /var/lib/redmine/public;
    proxy_redirect off;

    try_files $uri/index.html $uri.html $uri @app;

    location @app {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://unicorn-redmine;
    }

    error_page 500 502 503 504 /500.html;

    location /500.html {
        root /var/lib/redmine/public;
    }
}

Redmineの特定のページをHTTPSでアクセスする

ログインページ、パスワード変更ページ、管理ページをHTTPSとし、それ以外のページはHTTPとします。

Nginxによる設定

Redmineサイトにある次の記事に設定が記述されています。
http://www.redmine.org/projects/redmine/wiki/HowTo_configure_Nginx_to_run_Redmine

設定

/etc/nginx/conf.d/redmine.conf の作成

upstream unicorn-redmine {
    server unix:/tmp/unicorn_redmine.sock;
}

server {
    listen 80;
    server_name www.torutk.com;

    root /var/lib/redmine/public;
    client_max_body_size 2G;

    rewrite ^/login(.*) https://$server_name$request_uri permanent;
    rewrite ^/account/register(.*) https://$server_name$request_uri permanent;
    rewrite ^/users/new(.*) https://$server_name$request_uri permanent;
    rewrite ^/my/account(.*) https://$server_name$request_uri permanent;
    rewrite ^/my/password(.*) https://$server_name$request_uri permanent;
    rewrite ^/admin(.*) https://$server_name$request_uri permanent;

    location / {
        try_files $uri/index.html $uri.html $uri @app;
    }

    location @app {
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_connect_timeout 300;
        proxy_read_timeout 120;
        proxy_send_timeout 600;
        proxy_buffer_size 32k;
        proxy_buffers 4 32k;
        proxy_busy_buffers_size 32k;
        proxy_temp_file_write_size 32k;
        proxy_pass http://unicorn-redmine;
    }

    error_page 500 502 503 504 /500.html;
}

server {
    listen 443;
    server_name www.torutk.com;

    ssl on;
    ssl_certificate /etc/pki/tls/certs/server.crt;
    ssl_certificate_key /etc/pki/tls/private/server.key;

    root /var/lib/redmine/public;

    rewrite ^/$ http://$server_name$request_uri permanent;

    if ($uri !~* "^/projects/.*(copy|destroy|archive)") {
        rewrite ^/projects(.*) http://$server_name$request_uri permanent;
    }

    rewrite ^/guide(.*) http://$server_name$request_uri permanent;
    rewrite ^/my/page(.*) http://$server_name$request_uri permanent;
    rewrite ^/logout(.*) http://$server_name$request_uri permanent;

    location / {
        try_files $uri/index.html $uri.html $uri @app;
    }

    location @app {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://unicorn-redmine;
    }
}

設定事例(1)

http://qiita.com/kidachi_/items/985efebba639713c562e より

httpサーバー側の設定

upstream sample_app {
  server unix:/tmp/unicorn.sock;
}
server {
  :
  location ~ ^/user/info {
    rewrite ^(.*) https://$http_host$1;
    break;
  }
  location ~* {
    proxy_pass http://sample_app;
  }
}

httpsサーバー側の設定

upstream sample_app_443 {
  server unix:/tmp/unicorn.sock;
}
server {
  :
  location ~ ^/user/info {
    proxy_pass http://sample_app_443;
    break;
  }
  location ~* / {
    rewrite ^(.*) http://$http_host$1;
  }
}

ファイアウォール(iptables)にHTTPSを追加

現行のiptables内容を番号付きで確認します。

~$ sudo iptables -L --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1     1912  152K ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp --  any    any     anywhere             anywhere
3        0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
4        5   268 ACCEPT     tcp  --  any    any     anywhere             anywhere            state NEW tcp dpt:ssh
5        0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            state NEW tcp dpt:http
6      223 19483 REJECT     all  --  any    any     anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     all  --  any    any     anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 265 packets, 249K bytes)
num   pkts bytes target     prot opt in     out     source               destination
~$

HTTPSはポート番号443です。Chain INPUTの項にtcpのあて先ポート(dport)が443(https)のACCEPT定義を追加する必要があります。上から順番に適用されるので、REJECTの後に書いても撥ねられますので、REJECTの前にルールを追加します。

~$ sudo iptables -I INPUT 6 -m state --state NEW -m tcp -p tcp --dport https -j ACCEPT
~$ sudo iptables -vnL --line
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1     2411  191K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
4        5   268 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80
6        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:443
7      225 19797 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 47 packets, 31652 bytes)
num   pkts bytes target     prot opt in     out     source               destination
~$

追加結果を保存します。

~$ sudo service iptables save
iptables: ファイアウォールのルールを /etc/sysconfig/iptable[  OK  ]中:
~$

クリップボードから画像を追加 (サイズの上限: 1 GB)