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-/

クリップボードから画像を追加 (サイズの上限: 100 MB)