こんにちは。IT基盤部の片山です。
DeNAが提供するヘルスケア系サービスのインフラを担当しています。 今回は機密データを扱う機械学習環境の構築について紹介します。
はじめに
あるプロジェクトにおいて、提供されるデータの機密性が非常に高く、十分なセキュリティを担保した環境を構築したいという相談を受けました。 要件は以下の通りです。
- 共同研究者より提供されるデータを元にした機械学習プログラムを実行する
- プログラムは遠隔地にあるサーバで実行する
- 作業はプロジェクト専用の端末を用いる
- Windows端末の場合、管理者は利用者とは別にすること
- セキュリティルーム(*1) を用意し、本プロジェクトで利用するサーバへのアクセスは、セキュリティルーム内の専用端末からssh,httpsのみ許可する。
- https は Jupyter Notebook で使用
- (社内 github リポジトリ等)外部ネットワークへの通信は必要最低限に制限し、常時監視を行う
- ソースコードやプログラムの実行に必要なライブラリのダウンロードを行うことのみを想定
- 操作ログを取得する
- アンチウィルスソフトウェアを導入する
- 通信経路はすべて暗号化する
*1 セキュリティルームとは、プロジェクトメンバーのみが入室でき、外部との通信が制限されたネットワークのある部屋の事を指します
要件に対する対応案
サーバ側はヘルスケア系サービスで実績がある構成で対応できそうでしたが、クライアント環境はどのようにして要件を担保するか色々と方法を検討しました。 そして要件を以下のように落とし込みました。
- セキュリティルームとそれ以外のアクセスを区別できるようにする。
- 部屋の外で使えないようにPCが持ち出せない状況を作る。
- 無線LANを使えなくする。
- 専用端末に専用アカウントしかログインできないようにする。
- 意図しないデータの持ち込み、持ち出しが出来ないようにする。出来る場合は証跡が残るようにする。
- 外部への通信はネットワーク機器のACLで制御する
- 通信経路の暗号化についてはssh,httpsで通信するので問題ない
- アンチウィルスソフトウェアはサーバ、クライアント共に Symantec Endpoint Protection をインストールする
どの様に解決したか
全体の構成図は以下のようになりました。
クライアント、サーバ環境それぞれ見ていきます。
セキュリティルーム(クライアント環境)
まず、セキュリティルームはスマートロックを導入し、プロジェクトのメンバーのみが解錠可能としました。
セキュリティルーム内のネットワークは、他のDeNAスタッフと分ける必要があるため専用のVLANを割り当て、別のIPレンジとなるようにしました。 VLANの割り当て方法は後述します。 また、端末の管理番号とMACアドレスを元にIPを固定化しており、ファイアウォールでソースIPと特定のポートのみを開放するアクセス制御を可能にしました。
専用端末(Windows,Mac共通)
次に専用端末についてです。 端末はWindows、MacともにノートPCを利用するため、セキュリティルームから持ち出しが出来ないようワイヤーロックによる固定をしました。 管理者権限は端末を管理する別部門にて所有し、初期セットアップはしていただきます。 無線LANはADアカウントのステータスで無効化されるため、ネットワークの利用を有線LANに限定します。 他にもリムーバブルデバイスの利用は不可にしています。
端末へのログイン可能なアカウントについても専用のアカウントを発行します。 これはアカウントと所属VLANがADにて紐付けられているためです。
専用アカウントのログインにはAD認証と生体認証を併用しています。 これにより、専用アカウントは専用端末にのみログインできることを担保します。
専用アカウントに専用VLANが降ってくる仕組みはダイナミックVLANを使用しています。 アカウントに紐付いたクライアント証明書を用いて、802.1X認証によってVLANが決定します。
証跡を残す仕組みは2つの方法を導入しています。
1つは
ttyrec
で、sshの証跡を残します。sshはgatewayを必ず経由する必要があるため、gateway側でttyrecを実行しています。
もう1つは
ESS REC
で、こちらはgatewayを経由しないhttps通信の証跡を残すのに使います。
ESS REC はWindows専用のため、httpsを利用できるのはWindows端末に限定しています。
専用端末は用途にあわせて3種類あります。
- インフラ管理用端末(Mac)
- データ受領用端末(Windows)
- 開発者用作業端末(Windows)
インフラ管理用端末(Mac)
インフラ系の管理・運用を行うための端末で、Secure Zoneのサーバへアクセスできます。 ssh しか使わないためMacにしていますが、Windowsを使っても構いません。
データ受領用端末(Windows)
暗号化されたデータをダウンロードし、サーバへ配置する役割に用います。 この端末のみインターネットへの接続を許可されています。 proxyが設定されており、アクセス可能なFQDNが決められています。 ダウンロードはブラウザを用いるため、証跡には ESS REC が必要となるので Windows 端末を利用します。
開発者用作業端末(Windows)
その名の通り、開発者用の端末になります。 元々Macを使おうとしていましたが、Jupyter Notebookを利用する要件のため証跡が残せる Windowsとなりました。
これまでの情報をまとめると、専用部屋の専用の端末から、専用のアカウントを使い、専用のVLANを割り当て、機械学習環境へアクセスすることができます。
サーバ環境
サーバはオンプレミスで構成しており、データセンターにあるため物理的にアクセスできるのは一部のインフラ担当者だけです。 サーバ側は用途にあわせて2つのZoneに分けています。
DMZ
DMZには外部ネットワークへアクセスが必要なサーバを配置します。 具体的にはSMTP,DNS,NTPといった運用上必要なサーバと、後述の Secure Zone から外部へ接続するためのproxyサーバを立ててます。 proxyサーバを経由する理由は、外部ネットワークへの通信ログを取得するのが目的です。 この環境へのアクセスはインフラ担当のみが可能なため、開発者が外部へのアクセスに手を加えることは出来ません。
Secure Zone
このZoneにはプロジェクトで使用する機密データの保管と機械学習用のサーバを配置します。 Secure Zoneのサーバのrootアカウントは開発側で管理しており、インフラ担当は必要なコマンドだけ実行権限を与えられています。 これにより、インフラの担当者が機密データにアクセス出来ない様にしています。
From: Secure Zone 通信
ネットワーク機器にてこのZoneからの通信はすべて不可にしているため、意図しない外部への通信は発生しません。 他のZoneとの通信はDMZにあるproxyサーバを経由して外部接続できます。
To: Secure Zone 通信
sshはgateway経由でアクセスできますが、Jupyter Notebookを利用できるようにセキュリティルームからのhttpsは許可しています。
しかしポートは443のみ開放しているため、そのままでは1つしか起動できません。
そこでこのZoneにnginxをたて、https://{IP}/{PORT}/
のアクセスを http://{IP}:{PORT}/{PORT}/
へポートフォワードするリバースプロキシを用いて、各自がJupyter Notebook を好きなように使える様にしました。
おわりに
今回はバックアップ体制や冗長化、監視について触れていませんが、スタンダードな構成なため割愛しています。 またサーバはオンプレを利用していますが、クラウドサービスを利用した場合でも Security Group で対応できますので、参考になれば幸いです。
最後まで読んでいただき、ありがとうございます!
この記事をシェアしていただける方はこちらからお願いします。