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 ]中: ~$