見出し画像

添付ファイル暗号化、パスワード別送を…駆逐してやる!

現代社会に蔓延る、ファイルをメール送信する際の古い慣習… 。
そう、添付ファイルをzipでパスワードをかけて圧縮し、そのパスワードを別のメールで送信するアレの事です。

この慣習ができた根拠は何かあると思うのですが、ぼくが今回色々考えた末に出した結論(手段)を実装できたので書こうと思います。

※当然だけど、ファイルを共有する方法の理想はこれじゃないと思ってるよ

メールでファイルを送信する事のリスク

慣習ができた経緯には一切触れませんが、メールでファイルを送信し共有する事にどういったリスクがあるのかを先ず考えてみました。

誤操作
わかりやすく言うと誤送信です。誤って第三者へファイルを送信してしまい、情報を漏洩するリスクがあります。周りでやってしまった人を見かけた事がある人は多いのではないでしょうか。

外的脅威
盗聴や送信先のアカウントからファイルが漏洩するなど、要因はいくつかあると思いますが、何らかの要因で悪意を持った人へファイルが渡ってしまうと、そこから更に漏洩や悪用される恐れがあります。

内部不正
メールというのは本当に簡単にデータを持ち出す事ができてしまいます。何も対策をしていないメールシステムであれば、送信先が悪意を持った人であれ、私用のメールアドレスであれ送信でき、簡単に持ち出せてしまいます。

行き着いた結論(手段)

上記を踏まえて導き出した結論です。

画像1

③で送信されるメールのサンプル

画像8


④で送信されるメールのサンプル

画像7

誤操作への対策
今回の手段だと、Googleドライブへファイルを格納して共有リンクを送信先へ送信します。仮に誤送信があった場合、この共有リンクを無効にします。

外的脅威への対策
Googleドライブの共有リンクですが、ファイルの暗号化に用いるパスワードよりも強度が大幅に高いです。(数学的にちゃんと計算できないですが、共有リンクに辿り着く確率は、きっとzipパスワード解読する確率より大幅に低いです。誰か計算してほしい)

内部不正への対策
今回の手段を用いても内部不正は完全に防止する事はできません。ただ、GSuiteのDLPを用いているので、DLPルールに則ってデータの持ち出しを制限する事は可能ですし、送信元へはリンクが通知されませんので、共有リンクからの持ち出しは防止できます。

色々書きましたが、送信者は何も意識せずファイルを添付して送信するだけでいいので、利便性は大幅に向上します。わざわざパスワードかけて暗号化するの面倒ですよね?

フロー図

上記で構成を記載しましたが、もう少し細かく機能がわかる粒度でフロー図にしました。全てGSuiteで実装しています!

画像2

Gmail DLPの設定

利用している人は少ないかもしれないですが、DLPの機能を利用しています。
アプリ > G Suite > Gmail の設定 > 詳細設定 > 添付ファイルのコンプライアンス
※書いててココで気づいたけど、GSuite上の機能名称としてはDLPじゃないかも…がDLPという事にして続きも書きます🙏

で、DLPの設定ですが、下記が必要です。
・添付ファイル有無確認
・添付ファイル削除
・メール送信、転送
設定箇所を順に書いていきます。

1.影響を受けるメール
受信時、送信時に選択する項目です。今回は送信時に適用するので「送信」「内部 - 送信」にチェックを付けます。(内部送信はいらないかも)

画像3

2.各メッセージで検索するコンテンツを表す表現を追加
送信されたファイルの種類を区別したい場合は、条件を指定します。
全ての添付ファイルへ適用したいので、ファイル名に" . "(ドット)を含んでいるファイルを対象にします。
※無条件に全てのファイルへ適用する方法は無いようでした…
(見つけたら教えてほしい)

画像4

3.上記の表現が一致する場合は、次の処理を行います
受信したメールを、ファイル送信専用アドレスと送信先へ送信したいので、受信者を追加します。

送信先へ送信する設定
これで、添付ファイルを削除したメールが送信先へ送信されます。

画像5

ファイル送信専用アドレスへ送信する設定
・エンベロープ受信者にファイル送信専用アドレスを設定
・カスタムヘッダーを追加
(意図しないメールを処理してしまう事を防ぐ為に、カスタムヘッダーを付けて対照メールの認証をします)

画像6

DLPの設定は以上になります。

GASのコード

次にGASのコードですが、下記の通り。ファイル送信専用アドレスのアカウントでファイル作って実行してください(定期実行設定もお忘れなく!)

//以下はソースに記載しない方がいい物もあるので、適切に処理してください
//フォルダID(添付ファイルをアップロードする共有ドライブのID)
const FOLDER_ID = 'XXXXXXXXXXXXXXXXXX';
//DLPによって転送され、受信したメールのうちファイル転送するメールの条件(受信トレイにある添付ファイルがあるメールでよいと思います)
const SEARCH_TERM = 'has:attachment label:inbox';
//DLPで転送するメールに設定しているカスタムヘッダーの値
const key = 'XXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-XXXXXXXXX';

function send_mail_files(){
const folder = DriveApp.getFolderById(FOLDER_ID);
const threads = GmailApp.search(SEARCH_TERM, 0, 50);
if(threads.length){
  threads.map(function(thread){
    const messages = thread.getMessages();
    messages.map(function(message){
      if(!message.isInTrash()){
        const mail_key = message.getHeader("X-send_mail_files_key");
        if(mail_key === key){
          const attachments = message.getAttachments();
          var attachments_url = [];
          //添付ファイルをアップロードして共有リンク取得
          for(const attachment of attachments){
            const file = folder.createFile(attachment)
            const log_share = file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
            attachments_url.push(log_share.getUrl());
          }
          //メールを送る準備
          const mail_to = message.getTo();
          const mail_from = message.getFrom();
          var sender_name = mail_from.toString();
          //HTMLメールだと表示されないので、文字置き換え
          sender_name = sender_name.replace("<","(")
          sender_name = sender_name.replace(">",")")
          const mail_cc = message.getCc();
          const mail_bcc = message.getBcc();
          const mail_subject = message.getSubject();
          
          //bodyの値とそれにURL追記する
          var mail_body = "<<< 当社のEメールポリシーにより、ファイル送信専用アドレスからメールを送信させていただきます。送信専用アドレスの為、ご返信いただく事ができませんのでご了承ください。 >>>" + "<br><br>"+"送信者:"+sender_name+"<br>"+"以下、添付ファイルとなります。";
          attachments_url.map(function(url){
            mail_body = mail_body + "<br>"+url;
          })
          //メール送信数限界に来たらエラーで失敗するのでエラー処理入れとく
          try{
            //メール送信sendEmail(送信先、件名、本文、オプション)
            GmailApp.sendEmail(mail_to, mail_subject, mail_body,{
              from: 'hogehoge(株)-ファイル送信専用アドレス<send_mail_files@hogehoge.hoge>', 
              htmlBody: mail_body
            })
          }catch(err){
            console.log("エラー発生: "+ err);
            return;
          }
        }else{
          //意図しないメールを受信していた場合の処理(削除するだけでいいと思うけど)
          console.log("直接send_mail_files@へ意図しないメールが送信されているよ");
        }
        //送信が済んだメールは削除しておく
        message.moveToTrash();
      }else{
        //ゴミ箱のメールを拾っちゃってた場合の処理
        console.log("ゴミ箱入ってた!");
      }
    })
  })
}else{
  //処理対象のメールがなかった場合の処理 
  console.log("なんもなかったよ");
}
}


さいごに

こんな感じでやると、利便性もあり且つある程度安全に添付ファイルの送信が可能になります。しかも追加コスト無し!無し!

僕は実際にコレを使って仕事してみたいと思ってます。全社展開する場合はGASだと送信数などの制限にひっかかるので、Gmail APIに書き換える予定です。あと、共有リンク作成しっぱなしはリスクなので、定期で削除する機能とかも実装する予定です。

これさえあればISMSも怖くない!




この記事が気に入ったらサポートをしてみませんか?