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