2016年4月27日水曜日

サーバーのSSL/TLS設定を見直す

ssl_to_tls1年半ぐらい前に設定したときの覚書(下書きに埋まってた)。

SSLv3の脆弱性が報告され、攻撃者が通信の内容を複合できる。

Nginxでもデフォルトで有効になっているので設定する必要がある。

最近の設定はこんな感じ

#
# SSL
#
ssl on;
ssl_certificate      /etc/nginx/ssl.d/2016/cert.pem;
ssl_certificate_key  /etc/nginx/ssl.d/2016/key_nopass.pem;
ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
ssl_prefer_server_ciphers   on;
#ssl_stapling on;
#ssl_stapling_verify on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

 

下記サイトでまるっとチェックできる。

 

無料でSSLを発行できるLet's Encryptが正式版になったのでSSLの設定作業はデフォルトになりそう。

下記サイトも詳しそうなので今度設定するときにじっくり読む。

 

 

< Related Posts >

2016年4月26日火曜日

PostfixにSPFとDKIMと暗号化の設定まとめ

email_lockキャリアメール宛てに通知メールが届かないとクレームが入って調べたときの覚書。

auが一番厳しいらしい

基本はSPFレコードを設定していること。記述の仕方は下記サイトなどを参考に

確認するのは下記サイトで。

image

IPアドレスと送信元メールアドレスを入れて「Test SPF Record」をクリックするとチェックしてくれる。

 

ちなみにクレームの原因は送信元メールを本番用に変更するのを忘れてたから。

さらにDKIM(Domainkeys Identified Mail)を設定しておくと信頼性が上がる。

設定方法は前の記事を参考に

 

最近Gmailだと鍵マークが表示されるようになったので暗号化も対応する。前の記事を参考に

 

 

< Related Posts >

2016年4月25日月曜日

Aipoの起動スクリプトを作成。再起動しても自動起動するように

aipoサーバーを再起動したときにAipoの起動を忘れるので自動起動できるようにしたときの覚書。

環境: CentOS 6.7, Aipo 7.0.2.0

参考

 

起動スクリプト作成。Gistに置いた
# vi /etc/rc.d/init.d/aipo

実行権限付与
# chmod +x /etc/rc.d/init.d/aipo

起動テスト
# /etc/rc.d/init.d/aipo start

自動起動するように登録
# chkconfig --add aipo
# chkconfig aipo on
# chkconfig --list

そのままだとstartup.shにsudoが書かれている影響で自動起動できないので、rootはttyなしでsudo出来るようにする。
# vi /etc/sudoers.d/aipo

Defaults:root !requiretty

再起動して確認
# reboot

 

< Related Posts >

2016年4月22日金曜日

GitLabを別サーバーに移行

gitlab_move_serverGitLabを別サーバーに移行したときの覚書。

移行元: CentOS 6.7, Git 2.6.4, Ruby 2.2.2p95, GitLab 8.6.6
移行先: CentOS 6.7, Git 2.8.1, Ruby 2.2.4p230

 


1.移行先へGitLabをインストール

前の記事を参考に

 

いくつかハマったポイント

gitlab-ctl reconfigureするときはgitlab-ctl startの状態でやらないと下記エラーになる

[execute] psql: could not connect to server: No such file or directory
            Is the server running locally and accepting
            connections on Unix domain socket "/var/opt/gitlab/postgresql/.s.PGSQL.5433"?

 

redisをGitLab付属ではなく、インストール済みのredis serverを使う場合はTCP socketを使うように設定しておかないと500エラーになった。
# less /etc/redis.conf

port 6379
unixsocket /tmp/redis.sock
unixsocketperm 770

gitユーザーをredisグループに参加させる
# usermod -a -G redis git

接続テスト
# sudo -u git -H redis-cli -s /tmp/redis.sock ping

「PONG」が表示されれば接続できている。

参考

 


2.移行元でバックアップ → 移行先でリストア

公式サイトを参考にバックアップコマンド実行
# gitlab-rake gitlab:backup:create

/var/opt/gitlab/backups/にバックアップファイルが作られる。これを移行先へ持っていく。

# mv ~/1461141784_gitlab_backup.tar /var/opt/gitlab/backups/
# gitlab-rake gitlab:backup:restore BACKUP=1461141784

再起動
# gitlab-ctl restart

問題がないかチェック
# gitlab-rake gitlab:check SANITIZE=true

Repo base access is drwxrws---? ... no
  Try fixing it:
  sudo chmod -R ug+rwX,o-rwx /var/opt/gitlab/git-data/repositories
  sudo chmod -R ug-s /var/opt/gitlab/git-data/repositories
  sudo find /var/opt/gitlab/git-data/repositories -type d -print0 | sudo xargs -0 chmod g+s
  For more information see:
  doc/install/installation.md in section "GitLab Shell"
  Please fix the error above and rerun the checks.

権限を修正しろと出たのでメッセージ通りのコマンドを実行
# sudo chown -R git /var/opt/gitlab/gitlab-rails/uploads
# sudo find /var/opt/gitlab/gitlab-rails/uploads -type f -exec chmod 0644 {} \;
# sudo find /var/opt/gitlab/gitlab-rails/uploads -type d -not -path /var/opt/gitlab/gitlab-rails/uploads -exec chmod 0700 {} \;

 


3.移行元でGitLabをアンインストール

コマンド確認
# gitlab-ctl -h

アンインストール
# gitlab-ctl uninstall

データも削除
# gitlab-ctl cleanse

既に全部バックアップ済みなので生成されたファイルを削除
# rm -rf gitlab-cleanse-*

# rm -rf /opt/gitlab/

YUMリポジトリ削除
# rm /etc/yum.repos.d/gitlab_gitlab-ce.repo
 

 

< Related Posts >

2016年4月21日木曜日

Redmineをgit pullしてUpdate

redmine_update前の記事でRedmineをgit pullして最新に更新できるようにしたけど、実際やってみたらエラーになったときの覚書

環境: CentOS 6.7, Ruby 2.2.4p230

 


1.Rubyアップデート

rbenvを使ってRubyを2.2.4にアップデート

確認してインストール
# rbenv install -l
# rbenv install 2.2.4
# rbenv global 2.2.4

gem自体をアップデート
# gem update --system

bundlerをインストールし直し
# gem install bundler

確認
# gem list

 


2.Redmineアップデート

実はエラーになってからRuby 2.2.4に上げたので、エラーになった時はRuby 2.2.2。

Redmineのリポジトリに移動してgit pull
# cd /opt/redmine
# git pull

バンドルされているのをアップデート
# bundle update

エラー(下記エラーはRuby 2.2.2でbundle updateしたとき)

Warning: this Gemfile contains multiple primary sources. Using `source` more than once without a block is a security risk, and may result in installing unexpected gems. To resolve this warning, use a block to indicate which gems should come from the secondary source. To upgrade this warning to an error, run `bundle config disable_multisource true`.
Fetching gem metadata from http://rubygems.org/...........
Fetching gem metadata from https://rubygems.org/...........
Fetching version metadata from http://rubygems.org/...
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from http://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies....
Using rake 11.1.2 (was 10.4.2)
Using i18n 0.7.0
Using json 1.8.3
Using minitest 5.8.4 (was 5.8.3)
Using thread_safe 0.3.5
Using tzinfo 1.2.2
Using activesupport 4.2.5.2 (was 4.2.5)
Using builder 3.2.2
Using erubis 2.7.0
Using mini_portile2 2.0.0

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /root/.rbenv/versions/2.2.2/bin/ruby -r ./siteconf20160420-22231-ima0g.rb extconf.rb --use-system-libraries
checking if the C compiler accepts ... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/root/.rbenv/versions/2.2.2/bin/$(RUBY_BASE_NAME)
        --help
        --clean
/root/.rbenv/versions/2.2.2/lib/ruby/2.2.0/mkmf.rb:456:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
        from /root/.rbenv/versions/2.2.2/lib/ruby/2.2.0/mkmf.rb:571:in `block in try_compile'
        from /root/.rbenv/versions/2.2.2/lib/ruby/2.2.0/mkmf.rb:522:in `with_werror'
        from /root/.rbenv/versions/2.2.2/lib/ruby/2.2.0/mkmf.rb:571:in `try_compile'
        from extconf.rb:80:in `nokogiri_try_compile'
        from extconf.rb:87:in `block in add_cflags'
        from /root/.rbenv/versions/2.2.2/lib/ruby/2.2.0/mkmf.rb:619:in `with_cflags'
        from extconf.rb:86:in `add_cflags'
        from extconf.rb:336:in `<main>'

extconf failed, exit code 1

Gem files will remain installed in /opt/redmine/vendor/bundle/ruby/2.2.0/gems/nokogiri-1.6.7.2 for inspection.
Results logged to /opt/redmine/vendor/bundle/ruby/2.2.0/extensions/x86_64-linux/2.2.0-static/nokogiri-1.6.7.2/gem_make.out
An error occurred while installing nokogiri (1.6.7.2), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.7.2'` succeeds before bundling

 

※ここでRubyを2.2.4にアップデート。

もう一度バンドルされているのをアップデート
# bundle install --without development test --path vendor/bundle

エラー

make "DESTDIR="
compiling houdini_href_e.c
make: gcc: コマンドが見つかりませんでした
make: *** [houdini_href_e.o] エラー 127

gccコマンドがないのでYUM経由でインストール
# yum install gcc

もう一度アップデート
# bundle install --without development test --path vendor/bundle

エラーなく終了

データベースとプラグインをアップデートして、キャッシュをクリア
# bundle exec rake db:migrate RAILS_ENV=production
# bundle exec rake redmine:plugins:migrate RAILS_ENV=production
# bundle exec rake tmp:cache:clear tmp:sessions:clear RAILS_ENV=production

Redmine再起動
# /etc/rc.d/init.d/redmine restart

 

< Related Posts >

2016年4月14日木曜日

HTTPS(SSL) + session.resave=false + cookie.secure=trueの環境でセッションが使えない?

logoutTitaniumで開発したアプリを本番環境で動かしたときにログインしたあとセッションが持続できない現象を調査したときの覚書。

アプリ環境: Titanium SDK 5.5.2.GA
サーバー環境: CentOS7, nginx 1.8.1, Node.js v4.4.2, express 4.13.4

サーバーのAPIはNode.jsで実装していて、nginxからリバースプロキシしている。

他のプロジェクトはsession.resave=trueにして常に保存するようにしていた。resaveについては公式ドキュメントで。

app.use(session({
  key: APP.Config.cookie.key,
  path: APP.Config.cookie.path,
  secret: APP.Config.cookie.secret,
  cookie: {
    secure: true
  },
  resave: true,
  saveUninitialized: true
}));

今作っているアプリはログインせずにゲストでもいろいろ出来るので、resave=falseにして不要なセッションは作らないようにしてみた。

開発環境では問題なく動作していて、本番環境のHTTPS(SSL)で動かしてみるとセッションが維持できない。

ハマったのはiOSではセッションが維持出来たので(←気のせいだった)、Androidアプリ側の問題かと思っていた。

Cookieを使ったセッションの場合、サーバー側でセッションを保存するとレスポンスヘッダーの「Set-Cookie」に値が入る。

TitaniumだとHTTPClientのonload時にレスポンスヘッダーを見ればCookieに保存するかわかる。

console.log(this.getResponseHeader('Set-Cookie'));

 

nginxのリバースプロキシするときにちゃんとhttpsの通信だというのを指定する必要があった。

location /api/1/ {
    rewrite ^/api/1/(.*)$ /$1 break;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header Host $http_host;
    proxy_pass http://127.0.0.1:8880;
    proxy_redirect http:// https://;
}

必要なのはこの2行

proxy_set_header X-Forwarded-Proto https;
proxy_redirect http:// https://;

 

ドキュメントにあるようにNode.js側でtrust proxyも忘れずに

if (app.get('env') === 'production') {
  app.set('trust proxy', 1) // trust first proxy
  sess.cookie.secure = true // serve secure cookies
}

 

 

< Related Posts >

2016年4月8日金曜日

CentOS7 + Nginx + PHP7 + MariaDB + Node.jsの環境を構築する手順まとめ

CentOS6_platformカゴヤ・クラウド/VPSを借りて最小構成から環境構築したときの覚書。

CentOS6をセットアップしたときの記事を参考に

 

目次

  1. 初期設定
  2. nginxをインストール
  3. PHP7をインストール
  4. MariaDBをインストール
  5. phpMyAdminをインストール
  6. Node.jsをインストール
  7. postfix + DKIM(送信ドメイン認証)をインストール
  8. cronをインストール

 


1.初期設定

前の記事を参考に

このときの記事から変えたこと。

  • VPS上で時刻合わせは出来ないらしい。
    # yum remove chrony
  • SELinuxはgetenforceコマンドがなかったので飛ばした

 


2.nginxをインストール

公式ドキュメントに従ってYUMリポジトリを追加
# vi /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

# yum install nginx

起動、自動起動ON、確認
# systemctl start nginx
# systemctl enable nginx
# systemctl list-unit-files -t service | grep nginx

前の記事を参考にCPU数に合わせて設定する

 


3.PHP7をインストール

remiリポジトリのphp7を編集
# less /etc/yum.repos.d/remi-php70.repo

[remi-php70]
enabled=1

インストール
# yum install php php-fpm php-devel php-cli php-mysqlnd php-mbstring php-gd php-mcrypt

起動、自動起動ON、確認
# systemctl start php-fpm
# systemctl enable php-fpm
# systemctl list-unit-files -t service | grep php-fpm

画像変換はphp-gdではなくImageMagickを使うのでremiリポジトリの最新版をインストール
# yum install ImageMagick-last

確認
# convert --version

Version: ImageMagick 6.9.3-7 Q16 x86_64 2016-03-07 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2016 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: Cipher DPC Modules OpenMP
Delegates (built-in): bzlib cairo djvu fftw fontconfig freetype gslib gvc jbig jng jpeg lcms ltdl lzma openexr pangocairo png ps rsvg tiff webp wmf x xml zlib

PHPのImageMagick用エクステンションをインストール
# yum install php-pecl-imagick

確認
# systemctl restart php-fpm
# php -i | grep imagick

 


4.MariaDBをインストール

公式ドキュメントを参考にリポジトリ追加
# vi /etc/yum.repos.d/MariaDB.repo

# MariaDB 10.1 CentOS repository list - created 2016-04-07 10:30 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

# yum install MariaDB-server MariaDB-client

起動、自動起動ON、確認
# systemctl start mariadb
# systemctl enable mariadb
# systemctl list-unit-files -t service | grep mariadb

初期設定スクリプトを実行
# mysql_secure_installation

デフォルトの文字コードを「utf8mb4」にする。あとでチューニングする設定も。
# less /etc/my.cnf.d/mysql-clients.cnf

[mysql]
default-character-set=utf8mb4

# less /etc/my.cnf.d/server.cnf

[server]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
thread_handling = pool-of-threads
max_connections = 500

# Tuning
key_buffer_size = 128M
sort_buffer_size = 1M
read_rnd_buffer_size = 1M
query_cache_type = 1
query_cache_limit = 256K
query_cache_min_res_unit = 2k
query_cache_size = 80M

再起動
# systemctl restart mariadb

 


5.phpMyAdminをインストール

公式サイトからダウンロード。
# mkdir /home/httpd
# mkdir /home/httpd/httpdocs
# cd /home/httpd/httpdocs
# curl -O https://files.phpmyadmin.net/phpMyAdmin/4.6.0/phpMyAdmin-4.6.0-english.tar.gz

展開
# tar -xzvf phpMyAdmin-4.6.0-english.tar.gz
# mv phpMyAdmin-4.6.0-english phpMyAdmin
# rm phpMyAdmin-4.6.0-english.tar.gz

nginx設定
# cd /etc/nginx/conf.d/
# mv default.conf 00_default.conf
# rm example_ssl.conf

共通の設定ファイルを作る
# mkdir global
# vi global/fastcgi_php.conf

#
# PHP-FPM
#
if (!-f $document_root$fastcgi_script_name) {
    return 404;
}
# This is a robust solution for path info security issue and works with "cgi.fix_pathinfo = 1" in /etc/php.ini (default)

include fastcgi_params;
fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
fastcgi_intercept_errors on;

# vi 00_default.conf

server {
    listen       80;
    server_name  _;

    root    /home/httpd/httpdocs;
    index   index.php index.html index.htm;
    charset utf-8;

    location = /robots.txt  { access_log off; log_not_found off; }
    location = /favicon.ico { access_log off; log_not_found off; }

    location ~* \.php$ {
        include conf.d/global/fastcgi_php.conf;
        client_max_body_size 20M;
    }

    location ~ /\. {
        deny  all;
        access_log off;
        log_not_found off;
    }
}

configtestしてnginx再起動
# nginx -t
# systemctl restart nginx

ブラウザでアクセスしてみる。
http://111.222.333.444/phpMyAdmin/

「Variables」のタブでさっき設定した値が反映されているか確認

 


6.Node.jsをインストール

nodeユーザー追加
# useradd node
# passwd node

nginxの実行ユーザーと同じグループ「www」にする。
# groupadd www
# usermod -G www node
# usermod -G www nginx

確認
# groups node
# groups nginx

セッションの書き込みディレクトリ権限を変更。
# chown nginx.www -R /var/lib/php/

※ YUMでPHPが更新されたときに権限が変更されるので、毎回権限を変更し直す必要がある。

 

php-fpmとnginxの設定変更。実行ユーザーをnginx、グループをwwwにする。
# less /etc/php-fpm.d/www.conf

user = nginx
group = www

# less /etc/nginx/nginx.conf

user  nginx www;

再起動
# nginx -t
# systemctl restart nginx
# systemctl restart php-fpm

 

nvmを使ってNode.jsのインストール。
# su - node
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash

ログインし直してインストール。
# su - node
$ nvm ls-remote
$ nvm install v4.4.2
$ nvm alias default v4.4.2

npmをアップデート
$ npm update -g

前の記事を参考によく使うパッケージをインストールするシェルスクリプトを作成
$ vi npm-global.sh

#! /bin/sh

# Install Node Packages
npm install -g grunt-cli node-dev pm2 npmlist

# Show Installed List
echo
echo 'Completed!!'
echo
npm -g list --depth=0

権限を追加して実行
$ chmod +x npm-global.sh
$ ./npm-global.sh

 


7.postfix + DKIM(送信ドメイン認証)をインストール

メール送信するための設定。postfixをインストール。
# yum install postfix
# vi /etc/postfix/main.cf

myhostname = www.webserver.com
mydomain = webserver.com
myorigin = $mydomain
inet_interfaces = localhost
mydestination = localhost.$mydomain, localhost

起動、自動起動、確認
# systemctl start postfix
# systemctl enable postfix
# systemctl list-unit-files -t service | grep postfix

DKIMは前の記事を参考に

SPF(Sender Policy Framework)レコードの設定も忘れずに。

mailxをインストールして送信してみる。
# yum install mailx
# mail hoge@gmail.com

ログを確認する。/var/log/maillogに保存されなくなったみたい
# journalctl -u postfix

DKIMを監視しながらメール送信するとき
# journalctl -f -u opendkim

ちなみにGoogle Domainsを使っている場合は下記のようにTXTレコードを設定する

image

最後にGmailで表示される鍵マークに対応する(暗号化)
# less /etc/postfix/main.cf

#
# SMTP TLS
#
smtp_tls_CAfile = /etc/pki/tls/cert.pem
smtp_tls_security_level = may
smtp_tls_loglevel = 1

# systemctl restart postfix

 


8.cronをインストール

インストールされているか確認
# yum list installed | grep cron

インストール
# yum install cronie

サービス(デーモン)として登録されているか確認
# systemctl list-unit-files -t service

一時間ごとにWordPressのcronを実行するようにする場合
# vi /etc/cron.d/wordpress-cron

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""

# Excute WordPress WP_Cron
0 */1 * * * nginx curl https://hoge.com/wp-cron.php > /dev/null 2>&1

起動
# systemctl start crond

ログ確認
# journalctl -u crond

実行したコマンドログが出ないので直接確認
# journalctl | grep wp-cron

 

< Related Posts >

Related Posts Plugin for WordPress, Blogger...

Blog Archives