読者です 読者をやめる 読者になる 読者になる

tsukarooohi's diary

CakePHP,CentOS,AWSなど勉強中の技術的記録として利用中。

KUSANAGI for さくらに無料SSL証明書を導入してみた

Let's Encryptの無料SSL証明書を取得

# ディレクトリ移動
cd /usr/local/src

# Certbot クライアントのインストール
git clone https://github.com/certbot/certbot

# certbotの確認
ls -l
drwxr-xr-x 14 root root 4096  1月  7 17:10 certbot

# ディレクトリ移動
cd certbot

# 証明書取得
./certbot-auto certonly --webroot \
-w {ドキュメントルート} -d {SSL対象ドメイン} \
-m {メールアドレス} \
--agree-tos

# 下記のように出れば成功
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/{SSL対象ドメイン}/fullchain.pem. Your cert
   will expire on 2017-04-07. To obtain a new or tweaked version of
   this certificate in the future, simply run certbot-auto again. To
   non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

# 証明書の確認
ls -l /etc/letsencrypt/archive/{SSL対象ドメイン}
-rw-r--r-- 1 root root 1801  1月  7 17:22 cert1.pem
-rw-r--r-- 1 root root 1647  1月  7 17:22 chain1.pem
-rw-r--r-- 1 root root 3448  1月  7 17:22 fullchain1.pem
-rw-r--r-- 1 root root 1708  1月  7 17:22 privkey1.pem

先ほど確認した証明書などは/etc/letsencrypt/archive/{SSL対象ドメイン}以下に保存され/etc/letsencrypt/live/{SSL対象ドメイン}以下にシンボリックリンクが作成されます。 Let's Encryptの証明書は有効期限が90日間となっているため都度更新しないといけません。 この後自動更新の設定をするのですが、Let's Encrypt自体が自動更新を推奨しているのでこのように簡単なコマンドだけで証明書を更新できるようにしているみたいです。 更新すると先ほどの/etc/letsencrypt/archive/{SSL対象ドメイン}以下が更新されるわけですが、シンボリックリンクが貼られているためWebサーバー自体の設定の変更は必要なくなるという訳です。

# シンボリックリンクの確認
ls -l /etc/letsencrypt/live/{SSL対象ドメイン}
lrwxrwxrwx 1 root root 41  1月  7 17:22 cert.pem -> ../../archive/{SSL対象ドメイン}/cert1.pem
lrwxrwxrwx 1 root root 42  1月  7 17:22 chain.pem -> ../../archive/{SSL対象ドメイン}/chain1.pem
lrwxrwxrwx 1 root root 46  1月  7 17:22 fullchain.pem -> ../../archive/{SSL対象ドメイン}/fullchain1.pem
lrwxrwxrwx 1 root root 44  1月  7 17:22 privkey.pem -> ../../archive/{SSL対象ドメイン}/privkey1.pem

SSL通信用ポート開放

SSL通信用のポートは443になります。 下記サイトで自分のサーバーが443のポートを開放できているか確認してください

https://www.cman.jp/network/support/port.html

Webサーバーの設定変更

# ディレクトリ移動
cd /etc/nginx/conf.d

# 現設定ファイルのバックアップ
cp {WPディレクトリ名}_http.conf {WPディレクトリ名}_http.conf.org # http用
cp {WPディレクトリ名}_http.conf {WPディレクトリ名}_http.conf.org # https用
http用設定ファイルの編集
vim {WPディレクトリ名}_http.conf

# httpはhttpsへリダイレクト
server {
  listen 80;
  server_name {SSL対象ドメイン};
  return 301 https://{SSL対象ドメイン}$request_uri;
}
http用設定ファイルの編集
server {
    listen       443 ssl http2;
    server_name  {SSL対象ドメイン};

    ssl_certificate      /etc/letsencrypt/live/{SSL対象ドメイン}/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/{SSL対象ドメイン}/privkey.pem;
    ssl_dhparam /etc/kusanagi.d/ssl/dhparam.key;

    ssl_session_tickets     on;
    ssl_session_ticket_key     /etc/kusanagi.d/ssl_sess_ticket.key;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES2    56-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SH    A384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA25    6:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-    SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!    RC4";

    ssl_prefer_server_ciphers   on;
Nginxの再起動とSSLの確認
# kusanagiサーバーの場合
kusanagi restart
  • 再起動が完了したら実際にブラウザでアクセスしてhttpsになっているか確認
  • 今までのhttpのページからhttpsのページに301リダイレクトされるかの確認
  • SSL Server Testで暗号化レベルの確認

f:id:tsukarooohi:20170107190929p:plain

SSLの自動更新の設定

Let's Encryptの無料SSL証明書は有効期限が90日間となっているのですが、毎回手動で更新なんてしてられません。 Certbotクライアントには更新用のコマンドが用意されているため、それを1日/月にクーロンによって自動実行します。

# クーロン設定の確認
crontab -l
no crontab for root

# クーロン設定コマンド
crontab -e

# 毎月1日の1時に強制的に更新をします。
0 1 1 * * root /usr/local/src/certbot/certbot-auto renew –force-renew && systemctl restart nginx

# クーロンの設定確認
0 1 1 * * root /usr/local/src/certbot/certbot-auto renew –force-renew && systemctl restart nginx
crontab -l

これでLet's Encryptの無料SSL証明書の取得から設定、自動更新までが完了になります。 後は翌月にでもSSLの有効期限を確認し、ちゃんと更新されていれば問題なしです。

KUSANAGI for さくらへPostfix+Dovecotの導入方法

環境

Postfixの導入

# postfixのインストール(既にインストール済みなら必要ありません)
yum install postfix

# バージョン確認
postconf mail_version
mail_version = 2.10.1

# デフォルトMTAの切り替え
alternatives --config mta

1 プログラムがあり 'mta' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/sbin/sendmail.postfix # postfixが選択されているか確認

Postfixの設定をする

# ディレクトリ移動
cd /etc/postfix

# コピー作成
cp main.cf main.cf.org

# 編集
vim main.cf

myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP unknown

# ページ下部に追加
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtp_tls_security_level = may
smtpd_sasl_security_options = noanonymous
smtpd_recipient_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_unauth_destination
# postfixの設定確認
postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
broken_sasl_auth_clients = yes
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5
home_mailbox = Maildir/
html_directory = no
inet_interfaces = all
inet_protocols = all
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mydomain = example.com
myhostname = mail.example.com
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES
sample_directory = /usr/share/doc/postfix-2.10.1/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtp_tls_security_level = may
smtpd_banner = $myhostname ESMTP unknown
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
unknown_local_recipient_reject_code = 550

master.cfの編集

# コピー
cp master.cf master.cf.org

# 変更
vim master.cf

submission inet n       -       n       -       -       smtpd
-o smtpd_sasl_auth_enable=yes
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject_unauth_destination

SMTP-Auth設定

yum install cyrus-sasl

# 起動
systemctl start saslauthd

# 自動起動設定
systemctl enable saslauthd

--

Dovecotの導入

# dovecotのインストール(既にインストール済みなら必要ありません)
yum install dovecot

# バージョン確認
dovecot --version
2.2.10

10-mail.confの設定

# ディレクトリ移動
cd /etc/dovecot/conf.d

# コピー作成
cp 10-mail.conf 10-mail.conf.org

# 設定変更
vim 10-mail.conf

- #mail_location =
+ mail_location = maildir:~/Maildir

10-auth.confの設定

# コピー作成
cp 10-auth.conf 10-auth.conf.org

# 設定変更
vim 10-auth.conf

- #disable_plaintext_auth = yes
+ disable_plaintext_auth = no

10-ssl.confの設定

# コピー作成
cp 10-ssl.conf 10-ssl.conf.org

# 設定変更
vim 10-ssl.conf

- ssl = required
+ ssl = no

Dovocotの起動+自動起動設定

# Dovecotの起動
systemctl start dovecot

# Dovecotの自動起動設定
systemctl enable dovecot

メールアカウント用システムユーザーの作成

# 自動でMaildir形式のメールボックスが作成されるように
mkdir -p /etc/skel/Maildir/{new,cur,tmp}

# パーミッション変更
chmod -R 700 /etc/skel/Maildir/

# ユーザー作成(メールアカウント用なのでSSH接続はさせない)
useradd -s /sbin/nologin info

# パスワード設定
passwd info
ユーザー info のパスワードを変更。
新しいパスワード: #パスワードを入力してエンター
新しいパスワードを再入力してください: #パスワードを入力してエンター
passwd: すべての認証トークンが正しく更新できました。

ポートの開放

# 現在利用可能なサービス(ポート)を確認します。
firewall-cmd --list-services

# 現在利用可能なポートを確認します。
firewall-cmd --list-ports

firewall-cmd --zone=public --add-service=smtp --permanent
firewall-cmd --zone=public --add-port=25/tcp --permanent
firewall-cmd --zone=public --add-port=587/tcp --permanent
firewall-cmd --zone=public --add-port=110/tcp --permanent
firewall-cmd --zone=public --add-port=143/tcp --permanent

レコードの設定

# `mail.example.com`にAレコードでIPアドレスを登録
mail.example.com. A 000.00.000.000 # サーバーのIPアドレス

# `example.com`にMXレコードで`10 mail.example.com.`を設定
example.com. MX 10 mail.example.com.

# `example.com`にTXTレコードで`"v=spf1 ip4:000.00.000.000 -all"`を設定
example.com. IN TXT "v=spf1 ip4:000.00.000.000 -all"

以上でメールの送受信の設定は完了です。 後はメールアカウントの追加などを行ってください。

KUSANAGI for さくらへのphpMyAdmin導入方法

環境
  • CentOS 7
  • KUSANAGI Version 8.0.1-2
  • nginx version: nginx/1.11.6
  • php7-fpm
用語解説
  • DL:ダウンロード

phpMyAdminインストールと設定

f:id:tsukarooohi:20161223151144p:plain

コマンド処理

今回はrootアカウントで行っていますが、それ以外の作業アカウントの場合はsudoコマンドを付与して行ってください。

# ディレクトリ移動
cd /usr/local/src

# 最新ソースをDL
wget https://files.phpmyadmin.net/phpMyAdmin/4.6.5.2/phpMyAdmin-4.6.5.2-all-languages.tar.gz

# `phpMyAdmin-4.6.5.2-all-languages.tar.gz`がDLされたか確認
ls
phpMyAdmin-4.6.5.2-all-languages.tar.gz

# 解凍処理
tar xvzf phpMyAdmin-4.6.5.2-all-languages.tar.gz

# 解凍されているか確認
ls -l
drwxr-xr-x 12 root root     4096 12月  6 07:36 phpMyAdmin-4.6.5.2-all-languages
-rw-r--r--  1 root root 10372131 12月  6 08:40 phpMyAdmin-4.6.5.2-all-languages.tar.gz

# 解凍したphpMyAdminを移動(移動先はどこでもいいと思いますがドキュメントルートより上の階層がいいと思います)
mv phpMyAdmin-4.6.5.2-all-languages /usr/share/phpMyAdmin

# 元ファイルの削除(しなくてもいいと思います)
rm -fr phpMyAdmin-4.6.5.2-all-languages.tar.gz

上記でphpMyAdminのDL+配置作業は完了です。

次はphpMyAdminをブラウザから利用するための設定に進みます。

ですがNginxのバーチャル設定の前にphp-fpmの設定を少し変更します

Nginxとphp-fpmとの接続に UNIX socket を指定できるようにします。

socket 通信を使うとTCPで接続するので127.0.0.1:9000でアクセスするより早いようです。

# ディレクトリ移動(移動しなくてもいいです)
cd /etc/php7-fpm.d

# ファイルの確認
ls -l
-rw-r--r-- 1 root root  4580 11月 11 10:17 php7-fpm.conf.kusanagi
-rw-r--r-- 1 root root 19021 11月 11 10:17 www.conf
-rw-r--r-- 1 root root 18513 11月 11 10:17 www.conf.default
-rw-r--r-- 1 root root 19021 11月 11 10:17 www.conf.kusanagi

# .kusanagi はKUSANAGI for さくらのオリジナル設定がされているようなので触りません
vim www.conf
- listen = 127.0.0.1:9000
+ listen = /var/run/php7-fpm/php-fpm.sock #こちらに変更

# `/var/run/php7-fpm/`を確認
ls /var/run/php7-fpm/
php7-fpm.pid
#まだ`php-fpm.sock`はありません

# ミドルウェアの再起動
kusanagi restart

# `/var/run/php7-fpm/`を確認
ls -l /var/run/php7-fpm/
srw-rw---- 1 httpd www  0 12月 22 20:41 php-fpm.sock # 出来てますね!
-rw-r--r-- 1 root  root 5 12月 22 20:41 php7-fpm.pid

php-fpm.sockのユーザー、グループが上記にと同じになっていない場合は同じになっている事を確認してください。

rootになっている場合もありますが、その場合は下記ページなどを参考に上記と同じユーザー、グループになるよう行ってください。

それではphpMyAdminを使えるように設定します

# `phpMyAdmin`用のnginx設定ファイル作成
vim /etc/nginx/conf.d/phpmyadmin.conf

phpmyadmin.confの中身

server {
    listen       80;
    server_name  phpmyadmin.example.com; # ドメイン部分はご自分の環境に合わせてください

    root   /usr/share/phpMyAdmin;
    index  index.php;

    allow 000.00.00.00; # アクセスを解除するIPを設定してください
    deny all; # 基本アクセスは不可にしておきます

    location / {
        try_files $uri $uri?$args $uri/ /index.php?$uri&$args /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass   unix:/var/run/php7-fpm/php-fpm.sock; # 先程作成した`.sock`ファイル
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #include         fastcgi_params;
    }
}
# 上記の設定が出来たらミドルウェアの再起動
kusanagi restart

phpMyAdminサブドメインの設定

Nginx側の設定は上記で終わってるので、後はDNSの設定でサーバーまで繋げるだけです。 私の場合AWSのRoute53を利用しているので下記のように設定しました。

f:id:tsukarooohi:20161223151240p:plain

DNSの設定が反映されたか確認

MacBook-Pro:~$ nslookup phpmyadmin.example.com

Non-authoritative answer:
Name:   phpmyadmin.example.com
Address: 123.45.678.910 # ご自分のサーバーのIP

ブラウザでアクセス

phpMyAdminの画面が表示されれば完了になります。

「まんがでわかるLinux シス管系女子」を購入したら思いの外勉強になった

表題でも書いている通り下記書籍を購入。


まんがでわかるLinux シス管系女子(日経BP Next ICT選書)

他のガッツリ系の書籍と一緒に気分転換的な意味合いで購入してみたのが当り!
Linux初心者向けではあるけど充分為になった事が多かったので感想として残しておく。

あまり詳しく書くとネタバレにもなるので簡単に全体のストーリー紹介

GUI操作しかしたことない新入社員の女の子がひょんな事からシステム管理部署に配属。
てんやわんやしながら少しずつLinux操作に慣れていくって感じです。

私もWeb業界にいる事もあり基本的なWebサイトの構築はドメイン取得からWebサーバー、DBサーバー、メールサーバーの設置から運営・保守まで出来る感じではあります。
なのでLinuxのコマンドも多少は知ってて利用もしていたのですが、細かいオプションやコマンドの使い方を間違って認識してたりと基本的なコマンドの細かい操作方法など勉強になりました。
また「まんがで分かる」だけあって頭にも入ってきやすいですし、何より他のガッツリ系の書籍と違ってストーリーもある為読んでて疲れないw

知れてよかったと思う操作

scpコマンド

普段は鍵認証の設定時に公開鍵をアップロードする時に下記のように使ってました

scp -P {ポート番号} -i ~/.ssh/{秘密鍵} ~/.ssh/{新しい公開鍵} {ユーザー名}@{IPアドレス}:~/

で、ここからです。
私はscpコマンドをサーバーへのアップロード専用コマンドと勝手に思い違いをしていた為、サーバーからローカルにファイルなどをダウンロードしたい時に、
自分のルーターのIPは分かるんですが、ローカルPCまでのIPアドレスが分からなかった為諦めてSFTPクライアントなどを利用していました。

ですがscpコマンドの引数は下記の内容になる為、コピー元にリモートサーバー:{ファイル、ディレクトリ}、コピー先にローカルのパスを渡して上げればダウンロードが出来ちゃいます。

scp {コピー元:指定ファイル} {コピー先}

さらに言うとコピー元にリモートサーバー1、コピー先にリモートサーバー2と指定してあげればサーバー間のファイル転送もローカルPCから行えちゃうと言う素晴らしいコマンドなのです!

scp {リモートサーバー1:指定ファイル} {リモートサーバー2:ディレクトリ}

topコマンド

topコマンドでまず確認する値として下記があるかと思います。

Load Avg: 1.50, 1.61, 1.65

上記は左から1分、5分、15分間隔の平均CPU稼働率かと思っていました。
ですが実際は稼働率ではなく、CPUの待ちタスク数の平均だったみたいです。

他にもgrep、|(パイプ)、cut等など基本的なコマンドではあるんですがしっかりした使用方法、引数、オプションの意味など書籍として充分な内容を分かりやすく説明してくれています。


ただ唯一私が失敗した事が、、、別の書籍を買いに行ったついでに買ったものなので単行本として購入した為1,728円してしまった。
Amazonで見てみるとKindle版なら864円ってw


まんがでわかるLinux シス管系女子(日経BP Next ICT選書)


「まんがでわかるLinux シス管系女子 2」はKindle版で購入しようと思います。


まんがでわかるLinux シス管系女子 2(日経BP Next ICT選書)

フック処理を使った自動デプロイ

環境+設定内容は過去の記事を読んで頂ければと思います。
取り敢えずの目標
ローカルからmasterブランチにpushすればサーバの本番環境(www.example.com)
その他ブランチにpushすればサーバのテスト環境(debug.example.com)
それぞれにデプロイされる。


【作業ツリー】
サーバー
www.example.com
debug.example.com

ローカル
www.example.com

フック設定

vim ~/repos/www.example.com/httpdocs.git/hooks/post-update
# push されたブランチ名が BRANCH に入る
BRANCH=$(git rev-parse --symbolic --abbrev-ref $1)
#BRANCH="test"
if [ "${BRANCH}"="master" ]; then
	(
	cd /var/www/vhosts/www.example.com/httpdocs
	git --git-dir=.git fetch
	git --git-dir=.git reset --hard origin/master
	git --git-dir=.git clean -fdx
	)
else
	(
	cd ~/tmp
	git --git-dir=.git fetch
	git --git-dir=.git reset --hard origin/${BRANCH}
	git --git-dir=.git clean -fdx
	rsync -avr --delete --stats ./ /var/www/vhosts/debug.example.com/httpdocs
	)
fi

以上で完了。