鯖防人は忘れる。

機械音痴の鯖防人が忘れないように…

phpとSHA-512とMariaDBでSMTP認証

こんにちは。機械音痴の鯖防人。です。
今回はCyber研究会でサーバ構築の作業をしててわかったことを備忘録として書いておきます。

みなさんはPostfixDovecot使ってメールサーバ立ててますよね?
もちろん第三者にメールサーバを悪用(いわゆる踏み台に)されないようにSMTP認証をしていますよね?

Cyber研究会のメールサーバをPostfixDovecotで立てました。
(ふつうはPostfixAdminとか使うのだと思いますが)
私はphpからメールアドレスをデータベース(MariaDB)に登録したかったので
MariaDBのデータをSMTP認証の認証情報としてDovecotさんに利用してもらう、みたいな形を取りました。
参考にしたのは以下のサイトです。ありがとうございます。
CentOS7でPostfix + Dovecot + MariaDB(MySQL)でバーチャルメールボックスを利用してメールを送受信する (1) - Postfix の設定 | Postfix Tips & FAQ
[Linux] CentOS7 で Postfix + Dovecot + MariaDBでバーチャルメールボックスを利用してメールを送受信する (2) - dovecot の設定
下のSQL文でメールアカウント(メールアドレス)をデータベースに登録します。
  INSERT INTO users (email,password) VALUES('[作成するメールアドレス]', ENCRYPT('[パスワード]'));
入力されたパスワードをENCRYPT( )で暗号化しています。
このENCRYPT( )はUNIX/LinuxのCRYPT( )を使って暗号化しているようです。
でもこのCRYPT( )がいまいちわからない… DESで暗号化してるっぽいですが…
今回はDESを使わずSHA-512を使うことにしました。

まずDovecotの設定。

# vi /etc/dovecot/dovecot-sql.conf.ext

- default_pass_scheme = CRYPT
+ default_pass_scheme = SHA512-CRYPT

今回はSHA-512を使いましたが、他にもいろいろあります。
詳しくはDovecotのドキュメント
Authentication/PasswordSchemes - Dovecot Wiki
を見てください。
※間違ってもSHA-1MD5などを使わないように。
終わったらDovecotを再起動しておきましょう。

次にphp
phpのほとんどをCyber研究会の他のメンバーにかいてもらったので
私はINSERT文の部分だけ修正しました。
[追記]
今回は$_POST['email']の中身を検査して適切なものが入力されている前提でqueryを使用しています。
ですが、最低限のSQLインジェクション対策としてきちんとPDOのprepareを使用するべきでしょう。

<?php
//------省略------
$password = $_POST['password'];
$salt = substr(sha1(rand()), 0, 16);
$hashed = "{SHA512-CRYPT}" . crypt($password, "$6$$salt");
//------省略------
$sql = "INSERT INTO users(email,password) VALUES(\"" . $_POST['email'] . "\",\"" . $hashed . "\")";
$result = $pdo -> query($sql);
//------省略------
?>

みたいな感じです。
phpは下のサイトまんまです。ありがとうございます。
mad9scientist.com

以上です。
これでメールサーバの本格運用が始められます。

読んでいただきありがとうございました。
間違い等ありましたらご指摘いただければ嬉しいです。
それと、忙しいのにphpを書いてくれたCyber研究会のNくん、ありがとうございました。
忙しいのは私も同じなので、どうぞご安心を。


それでは。