サーバ技術の最近のブログ記事を表示しています。
過去のブログ記事については下部のリンクより参照ください。

SeversMan@VPSでLet's Encryptを導入

ServersMan@VPSのCentOS7でLet's Encryptを導入したので、備忘用のメモです。

低価格VPSであるServersMan@VPSですが、OpenVZという仮想化ソフトウェアを使っている点が特徴的です。
通常の仮想マシンとは異なり、どちらかといえばコンテナ寄りの方式です。
しかし、これに癖があり、デフォルトではinitscriptsパッケージのupdateがされない様になっています。
結果、依存関係が解けず、yum installを通すのが難しいという問題があります。

initscriptsの更新除外を外すという手もあるようですが、今回はrpmコマンドで導入する版の手順です。
※パワープレーで解くやり方になっていますので、実施は自己責任でお願いします。

Let's Encryptの導入手順は以下のサイトを参考に実施しました。
Let's Encryptの使い方〜SSL証明書の取得から更新の自動化まで〜

通常の手順でインストールすると、以下の状態となります。(--skip-brokenを付けてもインストールは成功しません。)
# yum install certbot
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.riken.jp
* extras: ftp.riken.jp
* updates: ftp.riken.jp
依存性の解決をしています
(中略)
エラー: systemd conflicts with initscripts-9.49.17-1.el7_0.1.x86_64
問題を回避するために --skip-broken を用いることができます。
これらを試行できます: rpm -Va --nofiles --nodigest

地道に依存関係を解いて、rpmコマンドでインストールしていきます。
(元々Pythonを使ってないサーバでしたので、インストール順序含め、概ね参考にできると思います。)

まずはパッケージをひたすらwgetします。
# mkdir /tmp/work_certbot
# cd /tmp/work_certbot
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/audit-libs-python-2.3.3-4.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/c/certbot-1.11.0-2.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/checkpolicy-2.1.12-6.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/libcgroup-0.41-6.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/libselinux-python-2.2.2-6.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/libsemanage-python-2.1.10-16.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/policycoreutils-2.2.5-11.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/policycoreutils-python-2.2.5-11.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/pyOpenSSL-0.13.1-3.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/python-IPy-0.75-6.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/python-backports-1.0-6.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/python-backports-ssl_match_hostname-3.4.0.2-4.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python-cffi-1.6.0-5.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python-chardet-2.2.1-3.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/python-configobj-4.7.2-7.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python-enum34-1.0.4-1.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python-idna-2.4-1.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python-ipaddress-1.0.16-2.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python-ndg_httpsclient-0.3.2-1.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python-ply-3.4-11.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python-pycparser-2.14-1.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python-requests-2.6.0-8.el7_7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python-requests-toolbelt-0.8.0-3.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/python-setuptools-0.9.8-3.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python-six-1.9.0-2.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python-urllib3-1.10.2-7.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python-zope-component-4.1.0-5.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python-zope-event-4.0.3-2.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/python-zope-interface-4.0.5-4.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-acme-1.11.0-1.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-certbot-1.11.0-2.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-configargparse-0.11.0-2.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python2-cryptography-1.7.2-2.el7.x86_64.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-distro-1.5.0-1.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-future-0.18.2-2.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-josepy-1.3.0-2.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-mock-1.0.1-10.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-parsedatetime-2.4-6.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.8.2003/os/x86_64/Packages/python2-pyasn1-0.1.9-7.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-pyrfc3339-1.1-3.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-requests-2.6.0-0.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/Packages/p/python2-six-1.9.0-0.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/pytz-2012d-5.el7.noarch.rpm
# wget http://ftp.riken.jp/Linux/centos-vault/7.0.1406/os/x86_64/Packages/setools-libs-3.3.7-46.el7.x86_64.rpm

そして、ひたすらインストールします。
python2-josepy-1.3.0-2.el7.noarch.rpmだけ、python2-setuptoolsの問題が解消できず...。
私の環境では問題なく動いているので、一旦無視しました。
# rpm -ivh audit-libs-python-2.3.3-4.el7.x86_64.rpm
# rpm -ivh checkpolicy-2.1.12-6.el7.x86_64.rpm
# rpm -ivh setools-libs-3.3.7-46.el7.x86_64.rpm
# rpm -ivh libcgroup-0.41-6.el7.x86_64.rpm
# rpm -ivh libselinux-python-2.2.2-6.el7.x86_64.rpm
# rpm -ivh libsemanage-python-2.1.10-16.el7.x86_64.rpm
# rpm -ivh python-IPy-0.75-6.el7.noarch.rpm
# rpm -ivh policycoreutils-2.2.5-11.el7.x86_64.rpm
# rpm -ivh policycoreutils-python-2.2.5-11.el7.x86_64.rpm
# rpm -ivh python-configobj-4.7.2-7.el7.noarch.rpm
# rpm -ivh python2-future-0.18.2-2.el7.noarch.rpm
# rpm -ivh python2-parsedatetime-2.4-6.el7.noarch.rpm
# rpm -ivh python-backports-1.0-6.el7.noarch.rpm
# rpm -ivh python-zope-event-4.0.3-2.el7.noarch.rpm
# rpm -ivh python-zope-interface-4.0.5-4.el7.x86_64.rpm
# rpm -ivh python-zope-component-4.1.0-5.el7.noarch.rpm
# rpm -ivh pyOpenSSL-0.13.1-3.el7.x86_64.rpm
# rpm -ivh python2-pyasn1-0.1.9-7.el7.noarch.rpm
# rpm -ivh python-ndg_httpsclient-0.3.2-1.el7.noarch.rpm
# rpm -ivh python-six-1.9.0-2.el7.noarch.rpm
# rpm -ivh python2-six-1.9.0-0.el7.noarch.rpm
# rpm -ivh python-ply-3.4-11.el7.noarch.rpm
# rpm -ivh python-pycparser-2.14-1.el7.noarch.rpm
# rpm -ivh python-cffi-1.6.0-5.el7.x86_64.rpm
# rpm -ivh python-enum34-1.0.4-1.el7.noarch.rpm
# rpm -ivh python-idna-2.4-1.el7.noarch.rpm
# rpm -ivh python-ipaddress-1.0.16-2.el7.noarch.rpm
# rpm -ivh python2-cryptography-1.7.2-2.el7.x86_64.rpm
# rpm -ivh python-setuptools-0.9.8-3.el7.noarch.rpm
# rpm -ivh python2-setuptools-39.2.0-4.el8.noarch.rpm
# rpm -ivh --force --nodeps python2-josepy-1.3.0-2.el7.noarch.rpm
# rpm -ivh python2-pyrfc3339-1.1-3.el7.noarch.rpm
# rpm -ivh python2-requests-2.6.0-0.el7.noarch.rpm
# rpm -ivh python-chardet-2.2.1-3.el7.noarch.rpm
# rpm -ivh python-urllib3-1.10.2-7.el7.noarch.rpm
# rpm -ivh python-requests-2.6.0-8.el7_7.noarch.rpm
# rpm -ivh python-requests-toolbelt-0.8.0-3.el7.noarch.rpm
# rpm -ivh pytz-2012d-5.el7.noarch.rpm
# rpm -ivh python2-acme-1.11.0-1.el7.noarch.rpm
# rpm -ivh python2-configargparse-0.11.0-2.el7.noarch.rpm
# rpm -ivh python2-distro-1.5.0-1.el7.noarch.rpm
# rpm -ivh python2-mock-1.0.1-10.el7.noarch.rpm
# rpm -ivh python2-certbot-1.11.0-2.el7.noarch.rpm
# rpm -ivh certbot-1.11.0-2.el7.noarch.rpm

Apache等のWEBサーバ系のサービスを停止しないと失敗するので、停止を先に実施します。
そして、以下のコマンドで証明書を導入します。
# certbot certonly --standalone -d www.example.com

ウィザードに従い、メールアドレスの入力や利用規約等の同意を行います。
問題なく終われば、証明書が/etc/letsencrypt/live内に生成されます。

あとはバーチャルホストに証明書の設定を行い、サービスを再起動すれば完了です。
Apacheの場合は、以下のように設定すれば使えると思います。
SSLCertificateFile /etc/letsencrypt/live/ドメイン名/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ドメイン名/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/ドメイン名/chain.pem

Let's Encryptは3か月で証明書の期限切れを迎えるので、自動更新の設定をお忘れなく。
以下のコマンドをcron等で実行すればOKです。
# certbot renew --pre-hook 'systemctl stop httpd' --post-hook 'systemctl start httpd'

補足ですが、certbotコマンド実行時にSSLErrorが出ることがあります。
その場合には、以下のコマンドでサーバ内のCA証明書を更新します。
# yum update ca-certificates

Gmailへのメールリレー設定

Gmailへのメールリレー設定を久々に実施したので、その時のメモです。
過去にもやったことはあったのですが、Google側のセキュリティ設定等も変わっていたので、少し嵌まりました。
以下の設定例はCentOS7です。

CentOS側の設定

必要なパッケージはpostfixとcyrus-sasl-plainです。
postfixは多くの場合デフォルトで入っていると思いますので、以下のコマンドでcyrus-sasl-plainを導入します。
[root@centos7 ~]# yum install cyrus-sasl-plain

main.cfには以下の設定を追加します。
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
smtp_use_tls = yes
smtp_tls_CAfile = /etc/pki/tls/cert.pem

ipv6を無効化している環境では、inet_protocolsを次の設定にします。
inet_protocols = ipv4

パスワードファイルの作成は色々なサイトに載っておりますが、念のために記載しておきます。
sasl_passwdというファイルを以下の内容で作成します。
[smtp.gmail.com]:587 <ユーザー名>@gmail.com:<パスワード>

portmapコマンドでhash化します。
[root@centos7 ~]# portmap /etc/postfix/sasl_passwd

Gmail側の設定

安全性の低いアプリのアクセスの設定をオンにします。
gmail.png

Google側の設定はたまに変わりますので、将来に渡って同じ設定でよいかはわかりませんが、本日時点では設定できました。
毎朝、サーバからメールで状態サマリを送っていますが、1月に入ってからSSHでのログイン試行が急増。
ポート番号は22番以外だったので、今までは特にアクセスはありませんでした。
恐らく、well-knownポート以外もポートスキャンされたのでしょう。
(22番で置いておくと、物凄くアクセスがあるので、精神衛生上、変えていたのですがね。)

ログインユーザーを調べてみる

とりあえず、Failed password forと含まれるログのユーザー名を見てみます。
[root@www01 ~]# cat /var/log/secure* | grep "Failed" | sed 's/invalid user //' | awk '{print $9}' | sort | uniq

とりあえず結果はファイルにおいてみましたが、記事作成時点では1963種ほどあるみたいです。
色々なアプリで使ってそうなユーザー名やら色々でした。
見たことあるユーザー名も結構含まれていて面白いですね。

抽出したユーザー名

アクセス元のIPアドレスを調べてみる

同様にIPアドレスを調べてみます。
[root@www01 ~]# cat /var/log/secure* | grep "Failed" | sed 's/invalid user //' | awk '{print $11}' | sort | uniq

アクセス元のIPアドレスは895個と中々の数です。

抽出したIPアドレス

全部引けるかはわかりませんが、IPアドレスからDNS名を逆引きしていみます。
[root@www01 ~]# cat /var/log/secure* | grep "Failed" | sed 's/invalid user //' | awk '{print $11}' | sort | uniq | while read; do nslookup; done > nslookup.txt
[root@www01 ~]# cat nslookup.txt  | grep "name ="

ぱっと見ですが、世界中からアクセスがあるみたいですね...。
イタリアであったり、アメリカであったり、ブラジルであったりと切りがありません。

国内からもアクセスがあるようですが、もしかして乗っ取られているのかもしれませんね...。
AbuselPDBで調べてみましたが、既に報告が上がっていました。
逆引きできたアドレスのDNS名からの判定ですが、確認できた国内のIPアドレスは4つありました。
1つ目は2019/12/5から、2つ目は2020/1/6から、3つ目は2019/12/8から、4つ目は2019/12/30から報告が上がっています。

キリがないのは分かっていますが、とりあえず既に上がっている分についてはアクセス制限するようにしたいと思います。

サーバ技術の過去のブログ記事