vps上にメールサーバ構築

webサービスのアカウント登録などに使うための捨てアドレスが欲しかったので自前でメールサーバ構築。
以下の環境で構築開始。

サーバ Serversman@vps
OS CentOS7.0

サーバの設定

本題に入る前にvpsの設定をいじる。
 userアカウント作成 
 sshでrootログイン禁止
 SELINUX Disabled
 ホスト名変更
 iptables設定変更
  INPUT DROP
   sshのポート穴あけ
  

Postfixを設定

設定自体はwebに沢山あるので調べながら進める。
今回参考にさせてもらったのは以下のサイト。
centossrv.com


vi /etc/postfix/main.cf
※左の数字は行番号
75 #myhostname = host.domain.tld
76 #myhostname = virtual.domain.tld
77 myhostname = duck-dz.kazika.net ※追記

85 #mydomain = domain.tld
 86 mydomain = kazika.net ※追記
 
 101 #myorigin = $myhostname
102 #myorigin = $mydomain
103 myorigin = $mydomain ※追記

117 #inet_interfaces = all
118 #inet_interfaces = $myhostname
119 #inet_interfaces = $myhostname, localhost
120 inet_interfaces = localhost
↓ に変更
117 inet_interfaces = all
118 #inet_interfaces = $myhostname
119 #inet_interfaces = $myhostname, localhost
120 #inet_interfaces = localhost


168 mydestination = $myhostname, localhost.$mydomain, localhost
169 #mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
170 #mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
171 #       mail.$mydomain, www.$mydomain, ftp.$mydomain
↓ に変更
168 #mydestination = $myhostname, localhost.$mydomain, localhost
169 mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
170 #mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
171 #       mail.$mydomain, www.$mydomain, ftp.$mydomain

422 #home_mailbox = Mailbox
423 #home_mailbox = Maildir/
424 home_mailbox = Maildir/ ※追記

577 #smtpd_banner = $myhostname ESMTP $mail_name
578 #smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
579 smtpd_banner = $myhostname ESMTP unknown ※追記
master.cfを編集
#smtp      inet  n       -       n       -       -       smtpd ※コメントアウト

submission inet n       -       n       -       -       smtpd ※コメントアウト解除
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes ※コメントアウト解除
各種サービス起動
sasl起動
systemctl start saslauthd
systemctl enable saslauthd.service


Postfix起動
systemctl restart postfix.service
systemctl enable postfix.service
ln -s '/usr/lib/systemd/system/postfix.service' '/etc/systemd/system/multi-user.target.wants/postfix.service'

とりあえず以上でサーバからメール送信することはできる。


はまった箇所
 サーバから自分のgmailにメール送信したときに遅れない問題
  

  • デフォルトメールクライアントがpostfixでなくsendmailだった

  →解決:alternatives --config mta コマンドでデフォルトmailコマンドを変更

  • dnsで名前解決ができていなかった

  →iptablesでINPUTに53ポートが許可されていなかった
   これが原因でyumcurlが出来なかった
   sshでログインする際も遅かった。これはアクセス元のIPアドレスを逆引きしようとしていて、
   名前解決できずにタイムアウトしてから次の処理に進むためだった。
   ログインしたときに、"Last login: Mon Jul 17 21:24:44 2017 from xxxxx.jp"
   これを表示するときのやつ。

  • logにipv6関連のメッセージが記載してあった。

   →IPv6に対応していないサーバ環境で出るメッセージだった模様。
       postfixのmain.cfの"inet_protocols = all"を"inet_protocols = ipv4"に変更

Raspberry Pi2に無線設定

Raspberry Pi2 typeBにUSB無線ドングルを買ってきて設定。DHCPで。

あんまり安いと発熱がすごいらしいのでこちらを購入。少し使用した状態だと発熱は大丈夫そう。

sudo iwlist wlan0 scan |grep ESSID
                    ESSID:"xxxxxxxxxx"
                    ESSID:"oooooooooo"
                    ESSID:"aaaaaaaa"

wpa_passphrase <ESSID> ←検索したSSIDを指定
# reading passphrase from stdin
ここにパスワード打ち込む

以下のようにネットワークの設定が生成されるので、コピー
network={
	ssid="xxxxxxxxxx"
	#psk="hogehoge"
	psk=4923805fdgnoas0gtwn4fgntl2l410anebtpabe0
}

sudo vim /etc/wpa_supplicant/wpa_supplicant.conf 
country=GB
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
#先ほどコピーしたネットワークの設定をここに貼り付け

再起動して、ifconfigでIPが振られていることを確認。

bashでランダムな2進数を生成

8bitの2進数をランダムに出したかったのでメモ。
bashでランダムな10進数の数字を2進数に変換する。

echo "ibase=10; obase=2 ; `expr $RANDOM % 256`" | bc

$RANDOM は0~32767までの数字を出力する
それをnで割った余りを割り出す。0~255までのランダムな数字がでてくる。
ibase=10進数; obase=2進数; <変換したい数字> | bc

という感じで、bashでランダムな10進数を2進数に変換。

linuxコマンドライン上からメール送信

linux上からメール送信したときのメモ。

[user@hostname ~]$ mail -s “件名” -r 送信元アドレス 宛先アドレス

#Enterを押したあとに本文入力。
#ヒアドキュメント的に入力できる。

お疲れ様です。
明日の飲み会行けたら行きます。
以上、よろしくお願いいたします。

入力終わったら、ctrl+Dで抜ける

grepコマンドで特定の文字列を抜きだす

linuxgrepコマンドを使っていて、特定の文字だけ抜き出したい時に調べたメモ。
以下のようなテキストファイルをベースに色々試す。「-w」「-x」などのオプションでの挙動の違いなど。

$ cat test.txt
duck
duckduck
hogehogeduck
duck 12345

#オプション無し
$ grep duck test.txt
duck
duckduck
hogehogeduck
duck 12345

#「-w」オプション
$ grep -w duck test.txt
duck
duck 12345

#「-x」オプション
$ grep -x duck test.txt
duck

「-w」は検索語にマッチする「行」を出力。

「-x」は行全体が検索語にマッチするかを判定。

manにも書いてある。

pythonで時間の計算をやってみた

やりたいこと
ある時刻「aa:aa」と「bb:bb」の差分の時間を計算させたい

なんとなくpythonで試してみる。
ちょっと調べるとweb上に沢山載っているので、ありがたく参考にした。

>>> import time
>>> from datetime import datetime
>>> t1 = '10:00'
>>> t2 = '08:35'
>>> t1 - t2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'str' and 'str'

変数に時間を入れてみて、引き算してみる。文字列とみなされるので引き算は当然エラー。

>>> time1=time.strptime(t1, '%H:%M')
>>> print (time1)
time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=10, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1)
>>> time2=time.strptime(t2, '%H:%M')
>>> time1-time2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'time.struct_time' and 'time.struct_time'

time.strptime()という関数が文字列を時刻の形にデータを直してくれるみたい。
年月日は指定していないので、今回は無視する。これもダメ。
#tm_wday
#tm_yday
#tm_isdst
#については調べる

もう少し調べてみると、datetime.strptime()というのもあるみたい。試してみる。

>>> time3=datetime.strptime(t1, '%H:%M') - datetime.strptime(t2,'%H:%M')
>>> time3
datetime.timedelta(0, 5100)
>>> print(time3)
1:25:00
>>> print((time3)*2)
2:50:00
>>>

これは内部では秒に変換してくれているみたい。この状態で引き算してみると、行けた。

ldapでsshログインできるようにする

ldapの構築メモです。

■やりたいこと
ldapサーバを立ててユーザを作成し、
sshでログインできるようにする。

■環境
OS:Cent6.7
openldap:openldap-2.4.40-5.el6.x86_64


参考にしたサイト
サーバ:

https://genchan.net/server/1670
http://www.unix-power.net/centos7/openldap.html

クライアント:
namihira.hatenablog.com






slappasswd<適当なパスワード>

ldapサーバ<適当なパスワード>

ldifファイル保存場所
/etc/openldap/ldap_data
ドメイン設定

database bdb
suffix "dc=my-domain,dc=com"
rootdn "cn=Manager,dc=my-domain,dc=com"

■サーバ編
ldapサーバ設定

#rootユーザで操作

Configuration Backendで管理しない場合、以下をやっておくといいかも

vi /etc/sysconfig/slapd
SLAPD_OPTIONS="-f /etc/openldap/slapd.conf"

設定ファイルのテンプレートをコピー

cp /usr/share/openldap-servers/slapd.conf.obsolete slapd.conf

管理パスワードを設定、暗号化された部分をコピー

slappasswd -s <パスワード>
{SSHA}G0mrY8fyCKqEqHlLerSIf2CPyKiipMXI3

データベースファイルのテンプレートをコピー

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

設定ファイルの変換実施

slaptest -u -f /etc/openldap/slapd.conf -v

所有者の変更

chown -R ldap:ldap /var/lib/ldap
chown -R ldap:ldap /etc/openldap/slapd.d

slapdの起動

service slapd start
slapd を起動中: [ OK ]

■クライアント編
#rootユーザにて実施

ldapのクライアントが入っているか確認する。無い場合はいれておく

# rpm -qa |grep openldap
openldap-2.4.40-5.el6.x86_64
openldap-clients-2.4.40-5.el6.x86_64
compat-openldap-2.3.43-2.el6.x86_64
openldap-devel-2.4.40-5.el6.x86_64
openldap-servers-2.4.40-5.el6.x86_64

以下のコマンドを実施、認証関係の設定を実施

# authconfig-tui

必要な項目を[スペースキー]を使って[*]を入れていく
ldapサーバのIPアドレスを入力、ベースDNにドメイン名と入れる(192.168.1.xx/dc=my-domain,dc=comと設定)

pam関連、nsswitchの設定ファイルをいじる
/etc/pam.d/system-authを編集、「sss」部分を「ldap」に。

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
#auth sufficient pam_sss.so use_first_pass
> auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so
account required pam_unix.so broken_shadow
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 500 quiet
#account [default=bad success=ok user_unknown=ignore] pam_sss.so
> account [default=bad success=ok user_unknown=ignore] pam_ldap.so
account required pam_permit.so
password requisite pam_cracklib.so try_first_pass retry=3 type=
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
#password sufficient pam_sss.so use_authtok
> password sufficient pam_ldap.so use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
#session optional pam_sss.so
> session optional pam_ldap.so

同じようにpassword-auth-acも編集、いじる箇所は上記と同じ

/etc/nsswitch.confも編集「sss」を「ldap」へ
nslscdサービスを起動
自動起動設定も設定

# service nslcd start
Starting nslcd: [ OK ]
# chkconfig nslcd on

ログインできるか確認

# ssh user@192.168.1.xx
Could not chdir to home directory /home/user: No such file or directory
-bash-4.1$ hostname
-bash-4.1$ whoami

→一応成功

homeディレクトリが無いので、ログインした時に作成する設定を入れる
system-auth、password-authを修正
ファイル末尾に以下を追加

session optional pam_oddjob_mkhomedir.so skel=/etc/skel umask=022

oddjobdサービスを起動

# service oddjobd start
Starting oddjobd: [ OK ]

一通りはこれで完了。