conohaのvpsにcentos7の作業環境作ったのでまとめ(ログイン環境編)

これまでdtivpsを作業環境として使っていたのだが、centos6からcentos7に環境を変えるのを契機にconohaに乗り換え。ということでログイン環境の設定をしたのでメモ。 今回は主にpostfixopenvpnの設定。 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
 }