postfixとdovecot

こないださくらのVPSをぶっ壊してしまった。

たしかiptablesのアップデートをしようと思い、アンインストール&インストールしようと思ったら、

めちゃくちゃになってしまい、ほとんどのサービスが消えてしまったのだ。


メールはpostfix + dovecotで、試行錯誤しながらなんとか送受信できていたのだが、

これを機会に1から「構築」(この言葉はおおげさで好きではないが)方法をまとめておく。



まず確認

# service postfix status
postfix: 認識されていないサービスです。

# service dovecot status
dovecot: 認識されていないサービスです。



yum install postfix


さあ、

#vi /etc/postfix/main.cf

とやりかけて、まてよと思い、main.cfのあるフォルダを見てみると、

main.cf.rpmsave

master.cf.rpmsave

というファイルがある。


ほかのサービスもそうだったのだが、.rpmsaveという拡張子のついたバックアップファイルのようなものが残っている。

これらのファイルをmvで main.cf, master.cfにする。


# which postfix
/usr/sbin/postfix

# service postfix status
master は停止しています

# service postfix start
postfix を起動中:                                          [  OK  ]


メールが送れるかテスト

# echo test | mail (gmailのアドレス)

瞬時に届く。



iphoneに登録してあるアカウントからメールを送信してみる。

「パスワードが違う」と言われる。



saslauthd を起動しないといけない。

# which saslauthd
/usr/sbin/saslauthd

# service saslauthd
使い方: /etc/init.d/saslauthd {start|stop|status|restart|condrestart|try-restart|reload|force-reload}

# /etc/init.d/saslauthd status
saslauthd は停止しています

# /etc/init.d/saslauthd start
saslauthd を起動中:                                        [  OK  ]




もう一度送信・・・送れた。


postfixの復旧は終わり。



次はdovecot

yum install dovecot

同様に設定ファイルの.rpmsaveがあるので、戻す。
/etc/dovecot/conf.d/


10-auth.conf
10-mail.conf

起動

# service dovecot start
Dovecot Imap を起動中:                                     [  OK  ]


gmailから、メールを送ってみる。

受信できた。












block解除時にブラックリストをチェックする

twitterでブロックしたアカウントのブロックを解除するスクリプトを、
毎日動かしている。

私のブロックは本当に迷惑だと感じてするよりも、
フォローしたけどつまらないから外すときにする。

ただフォローをはずすだけならフォローをやめればいいのだが、
ボットとか、フォローされたらすぐフォロー返しする人などの場合、
相手のフォローだけ残ってしまう。

それがいやなのでブロックしている。

しかし、本当にウザい広告とかは永遠にブロックしておきたいので、
ブラックリストを作ってそこに含まれるアカウントはブロック解除しないようにした。


----
import tweepy

consumer_key = 'xxxxxxxxxxxxxx'
consumer_secret = 'xxxxxxxxxxxxxxxx'
access_key = 'xxxxxxxxxxxxxxxxxxx'
access_secret = 'xxxxxxxxxxxxxxxx'

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
api = tweepy.API(auth_handler=auth)
results = api.blocks()

file =open("blacklist.txt").readlines()
blacklist=[]
for line in file:
    line=line.strip("\n")
    blacklist.append(line)

for result in results:
 if result.screen_name in blacklist:
    print 'In black list: ',result.screen_name
 else:
  print 'unblocking ',result.screen_name,'....'
  api.destroy_block(result.id)
----

blacklist.txt というファイルを作って、
ブロックしておきたいアカウント名を改行で区切って書いておく。

それを読んでリストにいれて、
unblockするときにそのリストに含まれていなければ、という条件をつける。

listにappendするときに \n をstripしないとリストの要素に改行文字が含まれてしまう。
そこは改行文字は無視してくれよと思う。
perlはそんなことしないでもバスっとかんたんにリストに読めたような記憶があるが・・・



これを作った後でおもったのだが、
今回はブラックリストを静的につまり手で書いて作ったが、
今後はblockしたアカウントを記録して回数を数えて、
閾値を決めて3回ブロックしたものはunblockしない、
とかしたい。





raspberry pi2のインストール

この前はWindows10 IoTなんたらをいれたのだが、
どうしていいかわからないので、RASPBIANを入れる。


ダウンロードする。

https://www.raspberrypi.org/downloads/raspbian/


RASPBIAN JESSIEというもの。

zipファイルなのだが、解凍できない。

7zipをインストールしたら、できた。

https://sevenzip.osdn.jp/


DD for Windowsをインストールし、micro SDにイメージを焼く。

http://www.si-linux.co.jp/techinfo/index.php?DD%20for%20Windows

「ディスクよりイメージファイルのほうが小さい」というわけのわからない警告がでる。

逆かと思ってサイズの大きいディスクをさがしかけた。


ディスプレイ・キーボードをつないで電源をいれるとGUIが起動する。

マウスもつなげる。

localeとかtimezoneとかを設定し、cliで立ち上がるようにする。

sshは有効になっている。

ssh localhost してみる。

pi/raspberry



ldapserver@centos7


最近仕事で認証がらみのことをよくやるようになったので、
ldapサーバを設定してみる。

ldapというのは、アクティブディレクトリで使われるプロトコルである。

というか、ldapといったらADつまりWindowsサーバである場合がほとんどではないだろうか。

Windowsサーバを買ったり借りたりするのはまだまだ高価なので、

さくらのクラウドで借りているcentos7で作ってみる。




インストール

yum install openldap openldap-servers openldap-lclients


DB設定をつくる(exampleをコピー)

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


パスワード生成(この値をあとで使う)

[root@adam ~]# slappasswd
New password: 
Re-enter new password: 
{SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


firewallでldapを許可

[root@adam ~]# firewall-cmd a--add-service=ldap --zone=public
success
[root@adam ~]# firewall-cmd --add-service=ldap --zone=public --permanent
success



slapd を起動

[root@adam ~]# systemctl enable slapd
[root@adam ~]# systemctl enable slapdstart slapd


設定はファイルを直接編集するのではなく、
.ldifという拡張子のついたファイルを作ってそこに設定内容を書き、
それをコマンドで読み込ませておこなう。


.ldifファイルは任意の場所で任意の名前で作ってよいようだ。


rootパスワードの設定(slappasswdで生成された値を書く)

[root@adam]# cat rootpw.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx



ここではまったのが、「replace: olcRootPW」の部分だ。
参考にした複数の情報では「add: olcRootPW」になっていたが、
それだと下記のようなエラーになる。


[root@adam]#  ldapadd -Y EXTERNAL -H ldapi:/// -f rootpw.ldif 
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"
ldap_modify: Inappropriate matching (18)
additional info: modify/add: olcRootPW: no equality matching rule


成功すると下記のようになる

[root@adam]# ldapadd -Y EXTERNAL -H ldapi:/// -f rootpw.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"


(なんでこうするのかはわからない。後で調べる)
→たぶん、参考にしたある情報ではrootpasswordを直接書き込んでいて、
olcRootPWのエントリがすでにあったから「add」ができなかったのだと思う。
デフォルト状態であればaddでよいはず。


ドメイン名

[root@adam]# cat change-domain.ldif
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
  read by dn.base="cn=Manager,dc=monqy,dc=net" read by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=monqy,dc=net

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=monqy,dc=net

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx



[root@adam]# ldapmodify -Y EXTERNAL -H ldapi:/// -f .change-domain.ldif 
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}monitor,cn=config"

modifying entry "olcDatabase={2}hdb,cn=config"

modifying entry "olcDatabase={2}hdb,cn=config"

modifying entry "olcDatabase={2}hdb,cn=config"



組織情報(Users, Groups)



[root@adam]# cat org.ldif
dn: dc=monqy,dc=net
objectClass: dcObject
objectClass: organization
dc: monqy
o: monqy

dn: ou=Users,dc=monqy,dc=net
objectClass: organizationalUnit
ou: Users

dn: ou=Groups,dc=monqy,dc=net
objectClass: organizationalUnit
ou: Groups
[root@adam]#



[root@adam]# ldapadd -x -D "cn=Manager,dc=monqy,dc=net" -W -f org.ldif
Enter LDAP Password:
adding new entry "dc=monqy,dc=net"

adding new entry "ou=Users,dc=monqy,dc=net"

adding new entry "ou=Groups,dc=monqy,dc=net"




クライアントからアクセスしてみる。

WindowsにJXPlorerというアプリをインストールする。

左上の connect to DSAというアイコンをクリックし、
ldapサーバのホスト名を入力して「はい」をクリックすると、
上記で設定したUsersやGroupsが表示される。


実際の認証は、後程



squid設定

設定をちょっといじったら動かなくなって
なかなか復旧できなかったので、再度メモ

認証のところ

これは、デフォルト設定にはない。

アクセス元アドレスは変わるので、限定できないが、
誰でもアクセスできるのはいやなので、認証するようにする。

とりあえずbasic認証で


---

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
http_access allow localhost

auth_param basic program /usr/lib64/squid/ncsa_auth /etc/squid/passwd
auth_param basic children 5
auth_param basic realm Squid Basic Authentication
auth_param basic credentialsttl 5 hours

acl AUTH proxy_auth REQUIRED
http_access allow AUTH

# And finally deny all other access to this proxy
http_access deny all

---


auth_param basic program /usr/lib64/squid/ncsa_auth /etc/squid/passwd
この行は、環境によってことなる。

/usr/lib64/squid/ncsa_auth は、認証するプログラム

find / -name ncsa_auth で、確認して書く。


/etc/squid/passwd は、ユーザとパスワードが設定されているファイル

htpasswd -c /etc/squid/passwd <username>

とすると、パスワードの入力が求められるので2回入力する。
-c は新規に作成する場合。

このファイルをcatしても、パスワードはそのまま記述されているわけではない。


認証できるか確認する
ncsa_authのあとにパスワードファイルを指定し、
ユーザ名とパスワードをスペースで区切って入力し、OKと表示されること

/usr/lib64/squid/ncsa_auth /etc/squid/passwd
<username> <password>