ServersMan¶
ServersMan@VPS
http://dream.jp/vps/
CentOS7の諸設定¶
localeの変更(UTF8)¶
言語変更は/etc/sysconfig/i18nではなくなっている。
# vi /etc/locale.conf #LANG=C LANG="ja_JP.UTF-8"
でコンソールの日本語化が可能。
rootによるSSHの禁止¶
# vi /etc/ssh/sshd_config - #PermitRootLogin yes + PermitRootLogin no
yumでのinitscripts更新の除外¶
なんとなく # yum update すると大変なことになるので注意。
CentOSに含まれるパッケージと、仮想化プラットフォームの相性により、
initscriptsを更新してしまうと、(再起動などのタイミングで)以降起動に失敗する。
- [OS初期時] initscripts-9.49.17-1.el7_0.1.x86_64
- [誤ってupdateした後] initscripts-9.49.24-1.el7.x86_64
こうなると、もうリモートから接続できなくなるので対処のしようがなく
ServersMan@VPSの中の人にお願いして、直してもらうしかない。
誤って更新しないよう、yumの更新対象から除外する。
# vi /etc/yum.conf + exclude=initscripts*
airdisplay(ajaxterm)の停止¶
デフォルトで設定されている。
これはどういうものかというと、ブラウザ経由で端末操作できてしまうもの。
例えば、ブラウザに
http://xx.xx.xx.xx/airdisplay/
と入力すると、もうログイン画面である。セキュリティ的にすごい気になる。
なので、止める。
# service ajaxterm stop
これで止まるのだが、リブートすると戻るので、
以下を実行すれば恒久的に止まる。
# systemctl disable ajaxterm.service
念のため、apacheの設定ファイルもどけておく
# cd /etc/httpd/conf.d # mv -i proxy_ajaxterm.conf proxy_ajaxterm.conf.org # service httpd restart
と、ここまでやっても、再起動すると勝手に起動してくる(!?)。
とりあえず、再起動毎に忘れずに止める運用で。
時刻同期¶
ServersManのサポート曰く、自動で行われるらしい。
不要なサービスの停止¶
saslauthd→SASL認証使ってない
xinetd→こっから呼び出すサービス使ってない
ので
# service saslauthd stop # service xinetd stop # systemctl disable saslauthd.service # systemctl disable xinetd.service
ApacheのServer情報を隠す¶
攻撃のヒントを与えてしまう場合があるので隠蔽する。
# vi /etc/httpd/conf/httpd.conf + ServerTokens Prod + ServerSignature Off
として、2行追加したら apache を再起動して反映する。
# service httpd restart
EPEL リポジトリ導入¶
EPEL リポジトリとは、CentOS 標準のリポジトリでは提供されていないパッケージを、yum コマンドでインストールすることを可能にするエンタープライズ向けのリポジトリのことです。サードパーティー製リポジトリの中では信頼性の高いものになっています。
# yum install epel-release # yum repolist
Clam AntiVirus 導入¶
ウィルス対策ソフトである Clam AntiVirus を導入する。
# yum install clamav clamav-update
ウィルス定義ファイル更新機能の有効化。
# vi /etc/freshclam.conf - Example + #Example
ウィルス定義ファイル最新化。
# freshclam
ウィルススキャンテスト。
# clamscan --infected --recursive /tmp
実際にチェックするには、こんな感じにする。
# clamscan --infected --recursive --exclude-dir='/sys|/proc|/dev' /
- --infected 感染を検出したファイルのみを結果に出力
- --recursive 指定ディレクトリ以下を再帰的に検査 圧縮ファイルは解凍して検査
- --log=FILE ログファイル
- --move=DIR 感染を検出したファイルの隔離先
- --remove 感染を検出したファイルを削除
- --exclude=FILE 検査除外ファイル(パターンで指定)
- --exclude-dir=DIR 検査除外ディレクトリ(パターンで指定)
Rootkit Hunter 導入¶
rootkitがLinuxサーバーにインストールされてしまっていないかチェックする。
インストール
# yum install rkhunter
定義を更新する。
# rkhunter --update # rkhunter --propupd
非対話モードでチェック(Enterを要求されない)エラーのみ表示する場合は、オプションを付加
デフォルトでは、ログが /var/log/rkhunter.log に出力される。
# rkhunter --check --skip-keypress --report-warnings-only
初回はいろいろ Warning が出力されるかもしれないが、ググって解消させる。
AIDE 導入¶
オープンソースのホスト型侵入検知システム(HIDS)。
インストール
# yum install aide
データベースファイルの作成
# aide --init # cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
改ざんチェック
# aide --check
データベースファイルの更新
# aide --init # cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
設定ファイルの編集
必要に応じて、編集する。というか、そうしないと日常的に更新されるファイルも改ざんとして通知されるので、ググって除外しよう。
# vi /etc/aide.conf
ざっくり日本国内だけ通信許可するiptables¶
IPアドレスの第一オクテッドだけ見て判断するようiptablesに設定しました。
こういう事が起こっていました。
- アメリカとか中国とか色んな国から、なんか悪いことを目的としたアクセスが頻繁にくる。
- よって、httpとhttps以外のポートは全て閉じたいが、自分的に不便。
- そうだ、日本国内だけ許可したらいいじゃない。
- ところが、SeversMan@VPSのCentOSのiptablesは、登録できるエントリー上限が256の模様(未確認)。
- なんとか256個の制限内に収めたい。
なので、こういう事にしました。
- 厳密に日本で使っているIPアドレス帯を許可しだすと膨大なエントリーになりそう。
- ipアドレスの第一オクテッド(つまり、aaa.bbb.ccc.ddd のaaa)だけを見て、日本かどうか判断しよう(適当)。
そこでまず、日本でどういうIPアドレス帯が使われているのか調べます。
以下にまとめて下さっている方がおります。
http://nami.jp/ipv4bycc/cidr.txt
日本管理のIPアドレスが何レコードあるか見てみますか~
$ curl http://nami.jp/ipv4bycc/cidr.txt|grep JP|wc -l % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1711k 100 1711k 0 0 3624k 0 --:--:-- --:--:-- --:--:-- 3625k 2297
2297件!やっぱり多い。
そこで、こんなことして、第一オクテッドだけにまとめちゃう。
$ curl http://nami.jp/ipv4bycc/cidr.txt|grep JP|awk -F'.' '{print $1,".0.0.0/8"}'|sort|uniq|sed -n 's/^JP\t//p'|sed -n 's/ //p'
こうすると88件にまとまってくれた。
もちろん、第一オクテッドしか見てないので、諸外国も混ざっちゃうんだけどだいぶリスクは下げたれたんじゃなかろうか。
後は、iptablesのINPUTチェインをDROPポリシーに設定した上で、ACCEPTとしてとして登録するだけ。
こんな感じの定義(いろいろ省略してます)
*filter :INPUT DROP [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -A INPUT -m state --state NEW -p tcp -s 1.0.0.0/8 -j ACCEPT -A INPUT -m state --state NEW -p tcp -s 101.0.0.0/8 -j ACCEPT -A INPUT -m state --state NEW -p tcp -s 103.0.0.0/8 -j ACCEPT ・ ・ ・ -A INPUT -m state --state NEW -p tcp -s 64.0.0.0/8 -j ACCEPT -A INPUT -m state --state NEW -p tcp -s 76.0.0.0/8 -j ACCEPT
ちなみに、以下のコマンドで登録したエントリー毎に通信量が見れます。
# iptables -nvL
オレオレ証明書を作りなおす¶
初期導入時の証明書は、数ヶ月で期限が切れるみたいなので、作り直します。
なぜオレオレ証明書を作るかというと、単にhttps通信で通信路を暗号化したいがためです。
オレオレなので、fish.minidns.netが、本当に本物のfish.minidns.netだという証明にはならないんですが、まぁ、ほとんど自分用のサイトなので、気にしません。
何も考えず呪文のように以下を入力すると、オレオレ証明書の生成から適用まで完了します。
# openssl genrsa 2048 > localhost.key # openssl req -new -key localhost.key > localhost.csr (対話形式で色々入力するけど、オレオレなので、まぁ適当でも) # openssl x509 -days 3650 -req -signkey localhost.key < localhost.csr > localhost.crt # chmod go-wrx localhost.??? # cd /etc/pki/tls/certs/ # mv -i localhost.crt localhost.crt.org # mv -i [新たに作ったやつのPATH]/localhost.crt ./ # cd /etc/pki/tls/private # mv -i localhost.key localhost.key.org # mv -i [新たに作ったやつのPATH]/localhost.key ./ # service httpd restart
Let's Encrypt サーバー証明書の取得と自動更新設定¶
Let's Encryptというサービスを利用することで、自分が所有しているドメインのSSL/TLSサーバー証明書を、無料で発行できるようになりました。
上記、オレオレ証明書を作りなおす代わりに利用できます。この証明書だとブラウザで警告は出ません。
Let's Encrypt インストール¶
以下で証明書の作成まで出来ます。
# cd /root # git clone https://github.com/letsencrypt/letsencrypt # cd letsencrypt/ # ./letsencrypt-auto --help # ./letsencrypt-auto certonly --webroot -w /var/www/html -d example.com -m sample@example.com --agree-tos
オプション
certonly 証明書の取得のみを行います。 --webroot ApacheなどWEBサーバのドキュメントルートに、認証用ファイルを生成します。 -w ドキュメントルートのパスを指定します。Apacheの場合は、DocumentRoot で指定しているパスです。 -d 証明書を取得するドメイン名を指定します。Apacheの場合は、ServerName で指定しているドメイン名です。 -m ご自分のメールアドレスを指定します。なにかトラブルがあった場合などに Let's Encrypt との連絡用に使用されます。 --agree-tos Let's Encrypt の利用規約に同意します。
エラーが無ければ、以下に作られています。
証明書
/etc/letsencrypt/live/<ドメイン名>/cert.pem
証明書+中間CA証明書
/etc/letsencrypt/live/<ドメイン名>/fullchain.pem
秘密鍵
/etc/letsencrypt/live/<ドメイン名>/privkey.pem
中間CA証明書
/etc/letsencrypt/live/<ドメイン名>/chain.pem
Apacheでの設定¶
Apacheの定義を修正します。通常、/etc/httpd/conf.d/ に格納されていますが、環境によって異なったり、
定義の中にinclude文があり、その先に記述されていたりしますので、注意が必要です。
ssl.conf や redmine-ssl.conf 等
- SSLCertificateFile /etc/pki/tls/certs/localhost.crt - SSLCertificateKeyFile /etc/pki/tls/private/localhost.key + SSLCertificateFile /etc/letsencrypt/live/fish.minidns.net/cert.pem + SSLCertificateKeyFile /etc/letsencrypt/live/fish.minidns.net/privkey.pem + SSLCertificateChainFile /etc/letsencrypt/live/fish.minidns.net/chain.pem
Apacheを再起動して、定義を反映します。
# service httpd restart
暗号化方式の制限¶
いくつか暗号化方式で脆弱性が発見されているので、脆弱性のある暗号化方式で通信しないようにします。
ssl.conf や redmine-ssl.conf 等
+ SSLProtocol all -SSLv2 -SSLv3 + SSLCipherSuite EECDH+HIGH:EDH+HIGH:HIGH:MEDIUM:+3DES:!ADH:!RC4:!MD5:!aNULL:!eNULL:!SSLv2:!LOW:!EXP:!PSK:!SRP:!DSS:!KRB5
Apacheを再起動して、定義を反映します。
# service httpd restart
証明書の更新¶
Let's Encryptの証明書の有効期限は90日間になります。
証明書が切れる前に、再度、以下のコマンドで更新が必要です。
# cd /root/letsencrypt # ./letsencrypt-auto certonly --webroot -w /var/www/html -d example.com --renew-by-default # service httpd restart
cron等に登録しておくと良いでしょう。
更新情報メモ¶
letsencrypt-auto が certbot-auto になった
http://blog.n-z.jp/blog/2016-05-13-letsencrypt-certbot.html
なのでこんな感じの実行になる
# cd /root/certbot # ./certbot-auto renew --force-renew # service httpd restart
ちなみに、cronにはこんな感じのシェルスクリプトが毎日動くように登録している
なんかね、、certbot-autoがタイムアウト終了する時が多くて、これならダメでも次の日リトライしてくれる
# SSLサーバ証明書の有効期限残り日数が60日を切ったら実行する
VALID=$(/root/certbot/certbot-auto certificates|grep -o "VALID:.*"|cut -d' ' -f2)
if [ "${VALID}" -lt 60 ]
then
# ここにcertbot-autoを実行するシェルスクリプト
fi
GetSSLへ乗り換え¶
certbot-autoがタイムアウトするようになってしまった。原因が判然としないが、既知の問題のようで、かつ解決していないらしい。
しょうがないので、代替コマンドを探した。
ACME クライアント実装
https://letsencrypt.org/ja/docs/client-options/
シェルススクリプト製のGetSSLがよさそうなので、乗り換えることにしました。
GetSSLのインストール
# curl --silent https://raw.githubusercontent.com/srvrco/getssl/master/getssl > getssl # chmod 700 getssl # ./getssl -c raintrees.net
/root/.getssl/getssl.cfg の修正
- CA="https://acme-staging-v02.api.letsencrypt.org" + #CA="https://acme-staging-v02.api.letsencrypt.org" - #CA="https://acme-v02.api.letsencrypt.org" + CA="https://acme-v02.api.letsencrypt.org" + ACCOUNT_EMAIL="yourname@example.com"
/root/.getssl/raintrees.net/getssl.cfg の修正
+ ACL=('/opt/alminium/public/.well-known/acme-challenge')
証明書を取得
# ./getssl raintrees.net
配置先の元からあるシンボリックリンクがあればリンクを削除する
# cd /etc/letsencrypt/live/raintrees.net/ # unlink cert.pem # unlink privkey.pem # unlink chain.pem # unlink fullchain.crt
サーバ証明書の配置
# cd /etc/letsencrypt/live/raintrees.net/ # cp /root/.getssl/raintrees.net/raintrees.net.crt ./cert.pem # cp /root/.getssl/raintrees.net/raintrees.net.key ./privkey.pem # cp /root/.getssl/raintrees.net/chain.crt ./chain.pem # cp /root/.getssl/raintrees.net/fullchain.crt ./fullchain.pem # chmod 644 cert.pem privkey.pem chain.pem fullchain.pem
Apacheを再起動して、定義を反映
# /sbin/service httpd restart
ちなみにcertbot-autoで証明書の有効期限を確認する仕組みから変更した
cronでこんな感じのシェルスクリプトが毎日動くように登録している
# SSLサーバ証明書の有効期限残り日数が30日を切ったら実行する
VALID=$(openssl s_client -connect 任意のドメイン:443 -servername 任意のドメイン < /dev/null 2> /dev/null | openssl x509 -noout -enddate|awk -F= '{print $2}'|date -d "$(cat -)" '+%s'|echo '(' $(cat) - $(date '+%s') ')/(60*60*24)'|bc)
if [ "${VALID}" -lt 30 ]
then
# ここにgetsslを実行して証明書を所定の位置に配置するシェルスクリプト
fi
Memo¶
ServersMan@VPS 「ServersMan@VPS」を使ってみました。設定方法やさまざまな機能の使い方・設定などを紹介しています。
http://webkaru.net/vps/cat/review/serversman/
ほのかなレンタルサーバ比較 レンタルサーバ講座 ServersMan@VPS
http://hikaku-server.com/rentalserver/
CentOSでサーバー公開するためのセキュリティ設定メモ
http://qiita.com/narumi888/items/179048afb48f64f45c6e
Serversman@VPSのネットワーク不調・TCP接続失敗
http://causeless.hatenablog.jp/entry/2015/06/21/205731
DTI の ServersMan@VPS には変な制限がある
http://www.makotoiwasaki.com/2014/11/dti-serversmanvps.html
Let's Encrypt サーバー証明書の取得と自動更新設定メモ
https://blog.apar.jp/linux/3619/
侵害有無を簡易に調査する Linux コマンド15選。侵害を受けたかもしれない Linux マシンを調べるときの参考
https://www.linkedin.com/pulse/quick-set-anomalies-look-identify-compromised-linux-system-b-/