CentOS


let's encrypt から さくらのSSL に乗り換え

CentOS6.8 で let's encrypt の自動更新が出来なくなった。
自動更新に必要な certbot-auto というプログラムが Python 3.5 以上を必要としているが、サポート期限切れである CentOS6.8 では現在 Python 3.4 までしかインストールできないようだ。

SSL証明書の更新ができないと困るので、一時的にlet's encrypt から さくらのSSL に乗り換えることにした。

さくらのSSL(990円) のSSL証明書はマルチドメインに対応していないので、ドメインの数だけ証明書の発行が必要になる。

参考:

https://www.idcf.jp/rentalserver/user-support/knowledge/ssl/sni.html

最初に必要なことはCSRの作成

SSL証明書の発行に必要なCSRのつくり方

openssl が必要なのでインストールされているか確認
--------------------------------------------
openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013
--------------------------------------------
OK
秘密鍵を置くディレクトリに移動。

/etc/ssl というフォルダがあったのでその中に sakurassl-sslkey というディレクトリを作ってそこに保存した。

移動
--------------------------------------------
cd /etc/ssl/sakurassl-sslkey
--------------------------------------------

OpenSSL のコマンドで RSA 暗号方式の秘密鍵を作成する場合
--------------------------------------------
openssl genrsa コマンドを利用
--------------------------------------------

秘密鍵ファイルの生成
--------------------------------------------
openssl genrsa -out ○○○.key 2048
--------------------------------------------
これで秘密鍵ができる

CSR生成
--------------------------------------------
openssl req -new -key ○○○.key -out ○○○.csr
--------------------------------------------

openssl genrsa -out wwwexamplecom.key 2048
openssl genrsa -des3 2048 > www.*****.jp.key
必須項目(他は空欄でいい)
--------------------------------------------------------------
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Aichi
Locality Name (eg, city) [Default City]:Nagoya
Organization Name (eg, company) [Default Company Ltd]:Nomu
Common Name (eg, your name or your server's hostname) []:利用するドメイン
--------------------------------------------------------------

入力が終わるとCSRができる。

これを使ってさくらのSSLの証明書を購入。

SSLの証明書を完了させるにはドメインの所有者確認があるので、以下のURLに認証ファイルをアップロードする。
http://example.com/.well-known/pki-validation/[ランダムな文字列].txt

購入後メールで証明書が届くのでサーバーにアップロードして
/etc/httpd/conf.d/vhost-le-ssl.conf ファイルを書き換える。
↑vhost-le-ssl の le はレッツエンクリプトの意味だと思う。
レッツエンクリプトをインストール時に作られたファイルを流用したことになる。
書き換える値は三つ
--------------------------------------------------------------------------------
SSLCertificateFile /etc/pki/tls/certs/localhost.crt ← 秘密鍵のファイルを指定
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key ← サーバー証明書のファイルを指定
SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt ← 中間証明書のファイルを指定(中間証明書が無い場合は省略可)
--------------------------------------------------------------------------------

構文チェック
---------------------------------------------------
httpd -t
---------------------------------------------------

apache 再起動
---------------------------------------------------
service httpd restart
---------------------------------------------------

証明書が更新されていることを確認。

let's encrypt更新時にエラー(Warning)が出ていた(2022年5月)

let's encrypt を cron で更新した際に飛んでくるメールにエラー(WARNING)が記載されていた。
-------------------------------------------------------------------------
WARNING: couldn't find Python 3.5+ to check for updates.
Skipping upgrade because new OS dependencies may need to be installed.

To upgrade to a newer version, please run this script again manually so you can
approve changes or with --non-interactive on the command line to automatically
install any required packages.
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/hyogen.info.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not yet due for renewal

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

The following certs are not due for renewal yet:
/etc/letsencrypt/live/hyogen.info/fullchain.pem expires on 2022-08-06 (skipped)
No renewals were attempted.
No hooks were run.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-------------------------------------------------------------------------

Python 3.5+ が見つからないとのこと。
いつからエラーが出ていたか過去のメールを調べてみたら2020年1月の時点でエラーが確認できた。
一年五か月前からエラーが出てはいるが、証明書の有効期限は更新されている。

メールにしたがって manually(手動)で更新して見る。

-------------------------------------------------------------------------
/var/myshellscript/lets_encrypt_renew.sh
-------------------------------------------------------------------------

もしくは

-------------------------------------------------------------------------
# sudo /root/certbot-auto renew --post-hook "sudo service httpd restart"
-------------------------------------------------------------------------

centos-release-scl(10:7-4.el6.centos)と centos-release-scl-rh(2-4.el6.centos)がインストールできないとエラーが出る
-------------------------------------------------------------------------

===================================================
パッケージ アーキテクチャ バージョン リポジトリー 容量
===================================================
インストールしています:
centos-release-scl noarch 10:7-4.el6.centos extras 12 k
依存性関連でのインストールをします。:
centos-release-scl-rh noarch 2-4.el6.centos extras 12 k

トランザクションの要約
===================================================
インストール 2 パッケージ

総ダウンロード容量: 24 k
インストール済み容量: 39 k
パッケージをダウンロードしています:
http://vault.centos.org/6.8/extras/x86_64/Packages/centos-release-scl-7-4.el6.centos.noarch.rpm: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 404 Not Found"
他のミラーを試します。
To address this issue please refer to the below knowledge base article

https://access.redhat.com/articles/1320623

If above article doesn't help to resolve this issue please open a ticket with Red Hat Support.

http://vault.centos.org/6.8/extras/x86_64/Packages/centos-release-scl-rh-2-4.el6.centos.noarch.rpm: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 404 Not Found"
他のミラーを試します。

パッケージのダウンロードでエラー:
10:centos-release-scl-7-4.el6.centos.noarch: failure: Packages/centos-release-scl-7-4.el6.centos.noarch.rpm from extras: [Errno 256] No more mirrors to try.
centos-release-scl-rh-2-4.el6.centos.noarch: failure: Packages/centos-release-scl-rh-2-4.el6.centos.noarch.rpm from extras: [Errno 256] No more mirrors to try.

Could not enable SCL. Aborting bootstrap!
-------------------------------------------------------------------------

centos-release-scl と centos-release-scl-rh の該当バージョンがインストールされていないのか確認

-------------------------------------------------------------------------
yum list installed | grep centos
-------------------------------------------------------------------------
該当なし。

インストールはできるのか確認。
-------------------------------------------------------------------------
yum list | grep centos
-------------------------------------------------------------------------

インストール可能な一覧には含まれている
-------------------------------------------------------------------------
centos-release-gluster7.noarch 1.0-1.el6.centos extras
centos-release-scl.noarch 10:7-4.el6.centos extras
centos-release-scl-rh.noarch 2-4.el6.centos extras
centos-release-storage-common.noarch 1-2.el6.centos extras
-------------------------------------------------------------------------

しかしインストールはできない。

http://vault.centos.org/6.8/extras/x86_64/Packages/centos-release-scl-rh-2-4.el6.centos.noarch.rpm にブラウザでアクセスしてみると

centOS6.8 には centos-release-scl-7-3.el6.centos.noarch.rpm しか提供されていない。

centOS6.10 には 7-4 があった。

postfixの送信履歴の見方

利用しているメーラー(MTA)の確認
----------------------------------
alternatives --display mta
----------------------------------

postfixを利用している場合は下記の結果になる
----------------------------------
リンクは現在 /usr/sbin/sendmail.postfix を指しています
----------------------------------

sendmaiを利用している場合は下記の結果になる
----------------------------------
リンクは現在 /usr/sbin/sendmail.sendmai を指しています
----------------------------------

メールログの場所
---------------------
/var/log/maillog
---------------------

OOM発動時にサーバーを再起動

現在の設定を確認
--------------------------------------------
# sysctl vm.panic_on_oom kernel.panic
vm.panic_on_oom = 0
kernel.panic = 0
--------------------------------------------

vm.panic_on_oom
OOM Killer が実行される際に、カーネルパニックを起こさせるかを制御するパラメータ

0 → カーネルパニックしない
1 → カーネルパニックする。但し cgroup 制限により物理メモリがまだ残っている場合にはカーネルパニックしない。
2 → 必ずカーネルパニックする

カーネルパニックとは、オペレーティングシステム(OS)のカーネル部分において、何らかの理由で致命的なエラーが発生し、安全に復旧することができなくなった状態。

kernel.panic = 0 → なにもしない
kernel.panic = 30 → 30秒後にリブート

--------------------------------------------
sysctl -a | grep vm.over
--------------------------------------------

現状
--------------------------------------------
vm.overcommit_memory=1
vm.panic_on_oom=1
kernel.panic=10
--------------------------------------------

vm.overcommit_memory:オーバーコミットするかどうかの設定
vm.overcommit_memory = 0 → オーバーコミット有効。実メモリの大きさまで割り当てる。
vm.overcommit_memory = 1 → オーバーコミット有効。実メモリ以上に割り当てる。

sysctl.conf を下記のように変更
#oom になったらカーネルパニックにさせてサーバーを再起動
--------------------------------
vm.overcommit_memory=1
vm.panic_on_oom=1
#15秒後に再起動
kernel.panic=15
--------------------------------

設定を反映
--------------------------------
sysctl -p
--------------------------------

httpdやmysqldを監視するmonitを導入する

monit を導入する

ダウンロードできるか確認
-----------------------------------
yum list available | grep monit
-----------------------------------

monit をインストール
-----------------------------------
yum install monit
-----------------------------------

設定ファイルをいじるので原本をコピー
-----------------------------------
cp -p /etc/monit.conf /etc/monit.conf_org
-----------------------------------
※centOS7.x系では設定ファイル名は monitrc

起動しているか(monitの状態確認)
-----------------------------------
monit summary
-----------------------------------

もしくは

-----------------------------------
monit status
-----------------------------------

結果:起動していない
-----------------------------------
Monit: the monit daemon is not running
-----------------------------------

monit を起動させる(centOS6.x系)
-----------------------------------
service monit start
-----------------------------------

monit を起動させる(centOS7.x系)
-----------------------------------
systemctl start monit
-----------------------------------

設定ファイルの編集
-----------------------------------
vi /etc/monit.conf
-----------------------------------

monit のログ(デフォルト)
-----------------------------------
cat /var/log/monit
-----------------------------------

monit.conf を見ると、include /etc/monit.d/ 以下のファイルがインクルードされているのが分かる
-----------------------------------
# Include all files from /etc/monit.d/
include /etc/monit.d/*
-----------------------------------

監視対象のデーモンは /etc/monit.d/ に個別にファイルを作ればいい。

crond の監視をする場合、下記の内容で crond.conf というファイル名にして /etc/monit.d の直下に置く
-----------------------------------
check process crond with pidfile /var/run/crond.pid
start program = "/etc/init.d/crond start"
stop program = "/etc/init.d/crond stop"
if 5 restarts within 5 cycles then unmonitor
-----------------------------------

mysqldはこれ
-----------------------------------
check process mysqld with pidfile /var/run/mysqld/mysqld.pid
start program = "/etc/init.d/mysqld start"
stop program = "/etc/init.d/mysqld stop"
if 5 restarts within 5 cycles then unmonitor
-----------------------------------

httpd(apache)はこれ
-----------------------------------
check process httpd with pidfile /var/run/httpd/httpd.pid
start program = "/etc/init.d/httpd start"
stop program = "/etc/init.d/httpd stop"
if 5 restarts within 5 cycles then unmonitor
-----------------------------------

メールの設定。monit.conf に書く
-----------------------------------
#yahooメールの送信サーバーを指定
set mailserver localhost

#アラートメールの内容
set mail-format {
from: monit@example.com
subject: $HOST : $SERVICE - $EVENT
message: Monit
ACTION : $ACTION
SERVICE : $SERVICE
at $DATE on $HOST.
DESCRIPTION : $DESCRIPTION
}

#送信先
set alert 自分のメール@yahoo.co.jp
-----------------------------------

個別設定ファイルを作ったらシンタックスのチェックも忘れずに
-----------------------------------
monit -t
-----------------------------------

シンタックスに問題なければ設定を反映
-----------------------------------
monit reload
-----------------------------------

サーバーが起動した際に monit も自動起動するか確認
-----------------------------------
# chkconfig --list monit
monit 0:off 1:off 2:off 3:off 4:off 5:off 6:off
-----------------------------------
run level 3 ~ 5 が on になっていれば自動起動する。↑これでは起動しない。

ちなみに mysqld の run level を確認すると 3~ 5 が on になっていた。
----------------------------------
#chkconfig --list mysqld
mysqld 0:off 1:off 2:off 3:on 4:on 5:on 6:off
---------------------------------

monit を自動起動に設定する
---------------------------------
chkconfig monit on
---------------------------------

スクリプトにより unmonitor になった場合に monitor に戻すとき
-----------------------------------
monit monitor all
-----------------------------------

一時的に unmonitor するとき
-----------------------------------
monit unmonitor crond

もしくは

monit unmonitor all
-----------------------------------

一度 unmonitor になると自動で戻らないので cron で定期的に戻す
-----------------------------------
#60分ごとに unmonit をリフレッシュ
*/60 * * * * /usr/bin/monit monitor all
-----------------------------------

マニュアルを開く
-----------------------------------
man monit
-----------------------------------

poderosaのssh2接続で使用していた秘密鍵をtermiusで使う

PoderosaをSSH2 形式で利用していて、PC に置いてある秘密鍵を iphone のターミナルでも再利用しようとコピペしたが使えない。

id_rsa というファイル名でこんな感じの内容だった
------------------------------------------------

---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----
Comment:
faejpg@gjewrewf:affewgwgrgfsdfdsfdsfsdffa
ejpg@gjewrewf:affewgwgrgfsdfdsfdsfsdffaej
pg@gjewrewf:affewgwgrgfsdfdsfdsfsdffaejpg
@gjewrewf:affewgwgrgfsdfdsfdsfsdffaejpg@g
jewrewf:affewgwgrgfsdfdsfdsfsdffaejpg@gjew
rewf:affewgwgrgfsdfdsfdsfsdf
---- END SSH2 ENCRYPTED PRIVATE KEY ----
------------------------------------------------

これはssh.com形式(SECSH)という形式の鍵で termius で使用するには OpenSSH形式への変換が必要らしい
認証鍵の形式についてはこちらを参考
「SSHの公開鍵ってなに?」の「認証鍵の形式」の章

ちなみにサーバーにアップロードされている公開キーは ssh-rsa~ から始まる一行の物でOpenSSH 形式だった。
------------------------------------------------
cat /home/ユーザー名/.ssh/authorized_keys
------------------------------------------------

ssh.com形式(SECSH)をOpenSSH形式へ鍵の形式変換

変換を試みる

ssh-keygen コマンドがあるか確認
------------------------------
which ssh-keygen
------------------------------

変換を実施
------------------------------
# ssh-keygen -i -f id_rsa > new_id_rsa
unsupported cipher 3des-cbc
decode blob failed.
------------------------------

失敗した。

別の方法で変換を試みる。

参考ページの方法で変換する↓
PoderosaのSSH2の秘密鍵をOpenSSHで使う

秘密鍵の変換は puttygen.exe を利用するとできるらしい。

1.ダウンロードしたputtygen.exe をダブルクリックで起動。
2. [Conversions]→[Import key] でPoderosaで作成した秘密鍵をインポート
3. [Conversions]→[Export OpenSSH key] で秘密鍵をエクスポート

出来上がった秘密鍵を iphone の termius に itunes のファイル共有から移動させて接続できた。

サーバーへの接続要求が失敗した数の味方

サーバーへの接続要求が失敗した数の味方

コマンド
-----------------------------------------
# netstat -s | grep Tcp: -A 10
-----------------------------------------

netstat -s は、システム起動後からのネットワークの統計値を表示するためコマンド

-A 10 はgrep のオプションで、十行うしろも表示

結果
-----------------------------------------
Tcp:
15707 active connections openings
1356123 passive connection openings
2425 failed connection attempts
33948 connection resets received
187 connections established
32977847 segments received
34238933 segments send out
298015 segments retransmited
14 bad segments received.
26367 resets sent
-----------------------------------------

failed connection attempts が失敗した接続の数

サーバーがつながらない。webページが表示されないときに確認すること。

1.ターミナルでサーバーにログインできるか。

poderosaを使用。サーバーにログインできるのであればサーバー自体は問題ないの判断。

2.HTTPサーバー(apache)は起動しているか確認。

---------------------------------
service httpd status
---------------------------------

もしくは

---------------------------------
/etc/init.d/httpd status
---------------------------------
/etc/init.dディレクトリ → デーモンを起動するためのファイル(起動スクリプト = rcスクリプト)が置いてある
rc は run command

結果(起動している場合)
---------------------------------
httpd (pid 1759) を実行中...
---------------------------------

2.HTTPサーバー(apache)が起動しているか確認。

---------------------------------
# service httpd status
---------------------------------

もしくは

---------------------------------
# /etc/init.d/httpd status
---------------------------------
/etc/init.dディレクトリ → デーモンを起動するためのファイル(起動スクリプト = rcスクリプト)が置いてある
rc は run command

結果(起動している場合)
---------------------------------
httpd (pid 1759) を実行中...
---------------------------------

3.mysql が起動しているか確認。
---------------------------------
# service mysqld status
---------------------------------

もしくは

---------------------------------
# /etc/init.d/mysqld status
---------------------------------

結果(起動している場合)
---------------------------------
mysqld (pid 1634) を実行中...
---------------------------------

apache は起動しているが mysql が落ちている時に、ページにアクセスすると php のエラーが出る

-----------------------------------------------------------
Warning: mysql_set_charset(): No such file or directory in /var/www/libs/~~~~

Warning: mysql_set_charset(): A link to the server could not be established in /var/www/~~~~~
ConnectError!DB Error: connect failed
-----------------------------------------------------------

この場合は、mysqld を再起動などする
-----------------------------------------------------------
sudo /etc/init.d/mysqld restart
-----------------------------------------------------------

4.webサービスに繋がらない原因はアクセス過多の場合が多いので現在のhttpdのプロセス数を確認する

-----------------------------------------------------------
ps aux |grep httpd |wc -l
65
-----------------------------------------------------------

この数字が http.cnf の ServerLimit を超えるとサーバーが停止する。

-----------------------------------------------------------

StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000

-----------------------------------------------------------

エラーログにもエラーが出る。

エラーログを調べる
-----------------------------------------------------------
cat /var/log/httpd/error_log
-----------------------------------------------------------

エラーログ一部抜粋
------------------------------------------------------------------------------
[Fri Aug 27 01:28:32 2021] [error] server reached MaxClients setting, consider raising the MaxClients setting
------------------------------------------------------------------------------

OS のエラーを調べると、上記エラーが出た時間の前後に oom-killer が発動しているのが分かる
-----------------------------------------------------------
cat /var/log/messages | grep oom
-----------------------------------------------------------

一部抜粋
-----------------------------------------------------------
Oct 6 02:24:02 hostname kernel: httpd invoked oom-killer: gfp_mask=0x200da, order=0, oom_adj=0, oom_score_adj=0
Oct 6 02:24:02 hostname kernel: [] ? oom_kill_process+0x82/0x2a0
Oct 6 02:24:02 hostname kernel: [ pid ] uid tgid total_vm rss cpu oom_adj oom_score_adj name
-----------------------------------------------------------
oom-killer が発動したときにサーバーに再起動が起こるように設定する
OOM発動時にサーバーを再起動

エラーログで不具合が起きたらしい時間帯のアクセスログを調べる場合は
-----------------------------------------------------------
cat /var/log/httpd/○○_access_log | awk -F - '"0:00:00" < $5 && $5 <= "15:00:00"'

-----------------------------------------------------------

$5 の部分はアクセスログに書かれた時間の位置で、$4 だったり数字を変える。

5.ネットワークの状態も確認する
-----------------------------------------------------------
# netstat -tpn
-----------------------------------------------------------

netstat で同じipアドレスからのたくさんの重複アクセスを確認したので、対策として mod_evasiveをインストールした
その時の記事
ただしあまり効果が感じられない。インストールしてもサーバーは止まるし、ipを遮断したらメールが来る設定にしているが遮断条件に満たなくてメールがあまり来ない。

ipアドレス別でサーバーに接続している数を調べる
-----------------------------------------------------------
# netstat -tan | awk '{print $5}' | cut -d : -f1 | sort -n | uniq -c | sort -n
-----------------------------------------------------------

-----------------------------------------------------------
37 66.249.68.××
42 157.55.39.××
42 40.77.167.××
43 157.55.39.××
45 207.46.13.××
51 66.249.68.××
2256 207.××.××.××
-----------------------------------------------------------
207.××.××.×× が異常な接続数なので ipアドレスを解析してクローラーでなければ ipアドレスを拒否する

netstat で大量のCLOSE_WAITを確認。その時に行った対策のメモ

サーバーがつながらない。CLOSE_WAITが大量発生

【さくらのVPS】WEBページが表示されない

ある日突然WEBページが表示されなくなった。
表示されなくなったサイトとは別のサイトのお問い合わせメールから知る。

アクセスするが確かに表示されない。2つ契約しているVPSサーバーのもう片方は問題なく表示できる。表示できないサイトと同じサーバーで運営している別サイトも表示できず。

さくらのVPSサーバーのコントロールパネルにはログイン可能。
特に問題も当たらず。

さくらのコールセンターに問い合わせる。

サーバーには問題ないとの答え。

ただ、ポート80(http)と443(https)が不通で通信ができてないとのこと。

問題を解決するにはポートを開放するか、apache の状態を確認しろと助言をもらう。

ターミナルからサーバーにアクセス。

apacheの状態を確認

//コマンド
----------------------------
/etc/init.d/httpd status
----------------------------

//結果
----------------------------
httpd status unknown due to insufficient privileges.
----------------------------

権限がないという事で root に変更して確認

//結果
----------------------------
httpd は停止しています。
----------------------------

やっぱり動いてなかった。

//apache を起動
----------------------------
service httpd start
----------------------------

//結果
----------------------------
httpd を起動中
----------------------------

無事WEBページを表示できた。

mailコマンドでメールを見る

mailコマンドでメールを見る

ターミナルにログインして
---------------------------------------
mail
---------------------------------------

ローカルに受信したメールのタイトルや日時などの情報の一覧が出る。

受信したメールが多くて一画面に収まらない場合

次のページへ移動
---------------------------------------
z
---------------------------------------

前のページへ戻る
---------------------------------------
z-
---------------------------------------

メール内容を表示
---------------------------------------
p 999(メール番号を指定)
---------------------------------------

1 / 41234