conohaのvpsにcentos7の作業環境作ったのでまとめ(ログイン環境編)
これまでdtiのvpsを作業環境として使っていたのだが、centos6からcentos7に環境を変えるのを契機にconohaに乗り換え。ということでログイン環境の設定をしたのでメモ。 今回は主にpostfixとopenvpnの設定。 postfixはroot宛メールをgmailに転送する用で、外向けに送信が出来ればいいので、真面目なメールサーバは作っていない。
パッケージのインストール
postfixはデフォルトでインストール済みなのでopenvpnだけインストール。 zshとか色々入れているけれど、ここでは割愛。 net-toolsは元々入っていたかもしれない。bridge-utilsはいらないかも。。。
sudo yum --enablerepo=epel install openvpn easy-rsa net-tools bridge-utils
設定
まずはホストネームとドメインネームの設定。
1.hostname
/etc/hostnameに以下を入れる。
<hostname>.<domain name>
2.domain name
centos7からはコマンドで設定。
sudo nmcli c modify eth0 ipv4.dns-search <donamin name>
設定入れたらリブート。
3.aliasとログイン時のslack通知の設定
今回は別ユーザにroot宛メールを転送し、それからgmailへ転送する。
まずはユーザの追加
useradd <new user> passwd <new user>
/etc/aliasesに以下を追加
root: <new user> <new user>: <mail address>
忘れずにnewaliases
sudo newaliases
- slackへの通知設定
事前にslackにてapi urlを取得しておき、/etc/ssh/sshrcに以下を追記
curl -X POST --data-urlencode \ "payload={\"channel\": \"#<channel name>\", \ \"username\": \"$USER\", \ \"text\": \"$USER has logged in from $SSH_CLIENT at `date +"%Y/%m/%d %p %I:%M:%S"`\", \ \"icon_emoji\": \":ghost:\" \ }" \ <slack api url> > /dev/null 2>&1 &
- sshのポート番号を変える
/etc/ssh/sshdのポート番号設定箇所(port=22
)を変更。デフォルトは22だが、好きな番号にする。
変えたらsshdをリスタート
- firewalld
/usr/lib/firewalld/services/ssh.xmlを/etc/firewalld/servicesにコピーして、ポート番号を変えておく。
firewall-cmd --add-service=ssh --permanent firewall-cmd --reload
smtp
1.postfix
基本はデフォルトの通りだが、以下修正箇所
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
2.dns
conohaのコンソールにて以下レコードを追加する。 今回はサブドメインを使用するのでAレコードも必要になる SPFとしてTXTレコードも入れるとgmailがメールに重要マーク付けてくれる。
MX record: mx.<donamin name> value=mail.<donamin name> A record: mail.<domanin name> value=<ip address> TXT record: value="v=spf1 ip4: <ipaddress> -all"
3.firewalld
忘れずにポート開放。
firewall-cmd --add-service=smtp --permanent firewall-cmd --reload
4.動作確認
- オープンリレーの確認
不正利用されないようにオープンリレーになっていないかの確認。 ブラウザで以下サイトにアクセスして自分のメールサーバを入力
check.jippg.org
メールサーバから以下アドレスにメール送るとspfの設定状況を返送してくれる。
check-auth@verifier.port25.com
openvpn
1.鍵の生成
easy-rsaをつかって鍵、証明書を作成。詳細は割愛。廃止リストも作っておく。今回は/etc/openvpn/keysに諸々の鍵を配置した。必要なのは ca.crt, server.crt, server.key, client.crt, client.key, ta.key, crl.pem dh2048.pem。
いつも忘れるのだが、crlは証明書(certificate)、keyは鍵(key)、crlは廃止リスト(certificate revocattion list)、pemはファイル形式を示しているだけ。ta.keyはtls-auth用の鍵でこれによりHMAC署名が付く。
2./etc/openvpn/server.confの修正
<port number>
は好きなポート番号に変える。デフォルトポートは使いたくない。
以下有効設定の抜粋
port <port number> proto udp dev tun ca keys/ca.crt cert keys/server.crt key keys/server.key dh keys/dh2048.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt keepalive 10 120 tls-auth keys/ta.key 0 # This file is secret cipher AES-256-CBC persist-key persist-tun status /var/log/openvpn-status.log log-append /var/log/openvpn.log verb 3 explicit-exit-notify 1 crl-verify keys/crl.pem script-security 2 --client-connect /etc/openvpn/up.sh --client-disconnect /etc/openvpn/down.sh
3.デーモンの設定
systemctlで設定する。 /usr/lib/systemd/system/openvpn@.serviceをopenvpn.serviceに書き換えて設定してもいいのだけれど、とりあえずopenvpn@serverにて対応。どっちのやり方が良いのかはよくわかっていない。
sudo sytemctl enable openvpn@server sudo sytemctl start openvpn@server
- up, down script
vpn接続時にslackに通知出す。 以下を/etc/openvpnに配置
up.sh
#!/bin/bash time=$(echo $(date +"%c")) USER=root TEXT=`cat <<EOF openvpn up virtual ip address = $ifconfig_pool_remote_ip ip address = $untrusted_ip $time name = $common_name EOF` curl -X POST --data-urlencode \ "payload={\"channel\": \"#<channel name>\", \ \"username\": \"$USER\", \ \"text\": \"$TEXT\", \ \"icon_emoji\": \":ghost:\" \ }" \ <slack api url> > /dev/null 2>&1 &
down.sh
#!/bin/bash time=$(echo $(date +"%c")) USER=root TEXT=`cat <<EOF openvpn down virtual ip address = $ifconfig_pool_remote_ip ip address = $untrusted_ip $time name = $common_name EOF` curl -X POST --data-urlencode \ "payload={\"channel\": \"#<channel name>\", \ \"username\": \"$USER\", \ \"text\": \"$TEXT\", \ \"icon_emoji\": \":ghost:\" \ }" \ <slack api url> > /dev/null 2>&1 &
4.ログの設定
ログのローテーションの設定/etc/logrotate.d/openvpnを作成し、以下を入力。
/var/log/openvpn.log { missingok notifempty sharedscripts postrotate systemctl restart openvpn@server 2>&1 > /dev/null || true endscript }
logrotate -dv /etc/logrotate.d/openvpn
にてdry-runが出来る。-fvにすると強制実行。
5.firewalld テンプレートをコピーして編集、ポート開放する。
cp /usr/lib/firewalld/services/openvpn.xml /etc/firewalld/services/ vi /etc/firewalld/services/openvpn.xml firewall-cmd --add-service=openvpn firewall-cmd --reload
openvpnで出来たtun0インターフェースにはinternalゾーンを適用
firewall-cmd --change-interface=tun0 --zone=internal nmcli conn show tun0
nmcliでないと、どのzoneが適用されているかが確認できないのだが理由がよくわからない。
※追記:この設定を入れてもゾーンはデフォルトのpublicが適用されている。仕方がないので、デフォルトゾーンをinternalに変更して対応。どうやらknown issueのようであるが、解消されてないのかな。 Bug 1065948 – firewalld zone not applied for vpn connections
firewalld
firewalld自体のログの設定
1.ログ取得の有効化
firewall-cmd --set-log-denied=all
にてdropしたログが/var/log/messagesに吐き出される。
2.modify /etc/rsyslog.conf
:msg, contains, "FINAL_REJECT" -/var/log/firewalld-drop.log
にてログを別ファイルに吐き出すように変える。 "FINAL_REJECT"はデフォルトのプレフィクス。 (本当はプレフィクスも変えたいが、デフォルトの設定がどうなっているのかよくわからないので、今回はそのまま)
3.logrotate
ローテーションの設定、ログのたまり具合が速かったのでdailyにしてみた。 /etc/logrotate.d/firewalldに以下を入力。
/var/log/firewalld-drop.log /var/log/firewalld { daily rotate 4 create postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript }