Postfix環境にSaMMAを導入して、メールの添付ファイルを安全に送付する（非PPAP環境の実現）for RockyLinux

PPAPでのファイル暗号化や添付ファイルの削除などメールの添付ファイルの制御が出来るSaMMA。
デージーネットさん作成だけに、日本での需要があるメールの添付ファイル取扱いをOSSで提供してくれます。
本環境は、Postfix環境に、SaMMAを導入し、NextCloudによる連係で、ファイルURLを相手に送る方式を実現します。
SaMMAについてはこちらを参照ください

https://www.designet.co.jp/open_source/samma/


## 1.導入準備

Postfixが稼動する環境を用意します。
今回は、PostfixAdminを利用した環境を使います。
導入方法は、「」をご覧下さい。
なお、SaMMAは、SendMialに依存しているため、本環境にもPostfixと同時にSendmailを導入します。
（SMTPとしての機能はPostfixを利用しますので、一部のツールのみをSendmail付属機能を利用します）


## 2.必用なライブラリの導入

以下のライブラリをインストールする

```:bash
dnf install sendmail
dnf install libdb-devel
dnf install glib2-devel
dnf install openldap-devel
```

### libgpg-error

```
cd /usr/local/src
wget https://gnupg.org/ftp/gcrypt/libgpg-error/libgpg-error-1.46.tar.bz2
tar xvjf  libgpg-error-1.46.tar.bz2
cd libgpg-error-1.46
./configure
make -j 8
make install
```

### gmime

gmimeは、Ver2系のみの対応。Ver2.99は動作しない

```
cd /usr/local/src
wget https://download.gnome.org/sources/gmime/2.6/gmime-2.6.23.tar.xz
tar xvJf gmime-2.6.23.tar.xz
cd gmime-2.6.23
./configure
make 
make install
```

### libmilter

```
cd /usr/local/src
wget https://ftp.sendmail.org/sendmail.8.17.1.tar.gz
tar xvzf sendmail.8.17.1.tar.gz
cd sendmail-8.17.1
cd libmilter/
make 
make install
```

### libspf

```
#epleを有効化する
dnf install epel-release
dnf install libspf2-devel
```


## 3. SaMMAをインストールする

```
cd /usr/local/src
wget https://ja.osdn.net/frs/redir.php?m=gigenet&f=samma%2F74992%2FSaMMA-5.0.3.tar.gz
tar xvzf SaMMA-5.0.3.tar.gz
cd SaMMA-5.0.3


autoreconf --install
autoheader
libtoolize
aclocal
automake --add-missing --copy
autoconf

./configure \
--with-gmime=/usr/local/ \
--enable-subjectsw
make
make install
```

## 4.設定ファイルを作成する

### errmsg.tmpl

```:errmsg.tmpl
cat > /usr/local/etc/samma/errmsg.tmpl << EOF
To: <@@TOADDR@@>
Subject: =?UTF-8?B?44OR44K544Ov44O844OJ6YCa55+l44Oh44O844Or?=

以下のメールに添付されたファイルの解凍パスワードをお知らせします。

件名: <@@SUBJECT@@>
日付: <@@DATE@@>
パスワード: <@@PASSWORD@@>

受信者:
<@@RCPTLIST@@>

添付ファイル名:
<@@FILENAME@@>

/****************************************************************
扱えない文字が入っており、文字化けを起こしている可能性があります。

There is a possibility that garbled characters are occurring.
****************************************************************/

EOF
```

### samma.tmpl

```:samma.tmpl
cat > /usr/local/etc/samma/samma.tmpl << EOF
To: <@@RCPTLIST@@>
Subject: 展開パスワードのご連絡
Content-Type: text/plain; charset=ISO-2022-jp
Content-Transfer-Encoding: 7bit

先ほどお送りしたファイルの展開パスワードを送付致します。

メール件名： <@@SUBJECT@@>
送信日時　：  <@@DATE@@>
パスワード： <@@PASSWORD@@>
送信者　　： <@@TOADDR@@>
受信者　　： <@@RCPTLIST@@>
ファイル名：
<@@FILENAME@@>

EOF
```

### os_uploader.tmpl 

```:os_uploader.tmpl 
cat > /usr/local/etc/samma/os_uploader.tmpl << EOF

Download URL:
<@@URL@@>

Attachment files:
<@@FILENAME@@>

Password:
<@@PASSWORD@@>
EOF

```

### sender
安全化非対象ドメイン
ただし、自ドメインを入れないと暗号化されない
つまり、このドメインから、rcptの該当ドメインに入る場合、暗号化される模様

```:sender 
cat > /usr/local/etc/samma/sender << EOF
internal.exmaple.com
EOF
```

### rcpt 
暗号化する宛先のドメイン。ここでは、自ドメイン以外は全てランダムパスワードで送る


```:rcpt
cat > /usr/local/etc/samma/rcpt<< EOF
jp
com
net
EOF
```

### os_uploader.conf

```:os_uploader.conf
cat > /usr/local/etc/samma/os_uploader.conf << EOF
NC_URL=https://nextcloudのfqdn (最後のスラッシュは除くこと）
NC_ADMIN=admin
NC_ADMINPW=adminのパスワード
HTTPS_CERT=False
TEMPLATE_FILE=/usr/local/etc/samma/os_uploader.tmpl
EOF
```

### whitelist

```
touch /usr/local/etc/samma/whitelist
```

### samma.conf
今回LDAPは利用しませんが、パラメーターがないと正常起動しないので何か値を入れておく

```:samma.conf
cat > /usr/local/etc/samma/samma.conf << EOF
commandPort=17777
CommandPass=secret
SyslogFacility=local1
ListenIP=0.0.0.0
ListenPort=20026
EncryptionTmpDir=/tmp
ZipCommand=/usr/local/bin/os_uploader
SenderDB=btree:/usr/local/etc/samma/sender.db
RcptDB=btree:/usr/local/etc/samma/rcpt.db
#ExtensionDB=btree:/usr/local/etc/samma/extension.db
TemplatePath=/usr/local/etc/samma/samma.tmpl
ErrorMessageTemplatePath=/usr/local/etc/samma/errmsg.tmpl
SendmailCommand=/usr/sbin/sendmail -i
ZipfileName=AttachFile.%Y%m%d.txt
ZipAttachmentContentType=text/plain
MailsaveTmpDir=/tmp
PasswordLength=8
StrCode=SJIS
DefaultEncryption=no
UserPolicy=no
LdapUri=ldap://192.168.1.1:389/
LdapBaseDn=ou=User,dc=internal,dc=example,dc=com
LdapBindDn=cn=admin,dc=internal,dc=example,dc=com
LdapBindPassword=password
LdapFilter=mail=%s
WhitelistPath=/usr/local/etc/samma/whitelist
AttachmentFileAlias=UnknownFileName
LoopCheck=no
AllowCharEnvelopeFrom=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\`~!@#$%^&*()_+-={}|[]:\";\'<>?,./
EOF
```


## 5.起動ファイルを作成
起動ユーザーにdaemonを指定しています。
パスワードメールは、/sbin/sendmail経由で送られるようで、SaMMAを起動したプロセスユーザー名がFromのアドレスとなって送ってくる。

権限を設定しておく
```
chmod -R 755 /usr/local/etc/samma
```

```
cat > /usr/lib/systemd/system/samma.service << EOF
[Unit]
Description=SaMMA (SAfety Mail gateway with Milter Api)

[Service]
ExecStart=/usr/local/bin/samma
Restart=always
User=daemon
Group=daemon

[Install]
WantedBy=multi-user.target
EOF
```

起動できるようにする

```
systemctl enable samma
systemctl start samma
```


## 6.Postfixの設定を変更

main.cfに追記する

```:/etc/postfix/main.cf
#
# SaMMA
#
#milter_default_action = accept
#milter_protocol = 6
smtpd_milters = inet:127.0.0.1:20026
#milter_default_action = tempfail
milter_default_action = reject
milter_connect_timeout = 30s
milter_content_timeout = 300s
```


## 7.spf-engineを入れる

```
cd /usr/local/src/SaMMA-5.0.3/contrib/spf-engine/
pip3 install spf-engine
pip3 install dnspython
```

設定ファイルを作成する

```:vi /etc/python-policyd-spf/policyd-spf.conf
#ディレクトリを作成する
mkdir -p /etc/python-policyd-spf

#設定ファイルを配置する
cat > /etc/python-policyd-spf/policyd-spf.conf << EOF
debugLevel = 1 
TestOnly = 1

Reason_Message = Access denied

HELO_reject = No_Check
#HELO_pass_restriction

Mail_From_reject = Fail
#Mail_From_pass_restriction

PermError_reject = True
TempError_Defer = True

skip_addresses = 127.0.0.0/8,::ffff:127.0.0.0/104,::1

Header_Type = None
#Hide_Receiver = No
Hide_Receiver = Yes
Authserv_Id = HEADER
fakeSender = dummy@spf.local

EOF
```

DNSに「spf.local」のゾーンファイルを作成し以下のTXTレコードを作成する

```
spf.local. TXT "v=spf1 include:spf.protection.outlook.com -all"
```

/etc/postfix/master.conf に以下を追加する

```:/etc/postfix/master.conf
policyd-spf unix - n n - 0 spawn user=nobody argv=/usr/local/bin/policyd-spf
```

/etc/postfix/mar.conf に以下を追加するin

```:/etc/postfix/master.conf
smtpd_client_restrictions = check_policy_service unix:private/policyd-spf, permit
```


あとは、postfixとsammaを起動して、テストを行う。


## 注意事項

### NextCloudアカウントの事前作成
NextCloudに、管理者のファイル送付用のアカウント以外に、メール送信者のFromアドレスを持ったアカウントが作成されていないといけない。
作成されていないと、送信中にエラーになる


### パスワードポリシーに注意
添付ファイル送信中にエラーが発生する場合、NetxCloud側のWebサーバーのログを確認する。
「/ocs/v2.php/apps/files_sharing/api/v1/shares?path=」で、403エラーが出るケースがある。
API的には、パブリックに共有することが許可されていないと記載があるが、それ以外に、パスワードポリシーが10文字以上に設定されている場合(デフォルト）、SaMMAは8文字のパスワード生成のようでこのポリシーに違反して403エラーが発生する。

### NextCloudのURLにパスワードを一緒に送付する

NextCloudの仕様としては、NextCloudにアップロード後、URLとファイルは、送信メールのユーザーに記載されるが、パスワードメールはメールの送信元にSaMMAから自動送信される。（送信元Fromは、SaMMAのサービスで利用しているユーザー名）
今回は、送信者に自動的にパスワードも送るようにカスタマイズする方法を紹介します。


/usr/local/bin/os_uploader を編集

make_output メソッドを変更

```:/usr/local/bin/os_uploader

#37行目付近
TAG_URL = '<@@URL@@>'
TAG_FILES = '<@@FILENAME@@>'
TAG_PASSWD = '<@@PASSWORD@@>' #追加

---

#make_outputの中を編集
def make_output(conf, vals):

    encpw = ""  #追記

    # read template file
    try:
        encpw = urllib.parse.quote(vals['password'])  #<-追記
        f = open(conf['TEMPLATE_FILE'], 'r')
        tmpl = f.read()

    # replace tags
    data = tmpl.replace(TAG_URL, vals['shared_url']).replace(TAG_FILES, files)
#　　↓以下のように変更
    data = tmpl.replace(TAG_URL, vals['shared_url']).replace(TAG_FILES, files).replace(TAG_PASSWD,encpw)

---
```


## NextCloudの設定

- User retentionアプリの有効化
- Files automated taggingアプリの有効化