IT の基礎
認証、認可、暗号化
システムへのアクセスは、相手が誰かを確かめる認証と、その相手に操作を許すかを決める認可の 2 段階で判定します。暗号化は、通信の途中と保存先の 2 か所でデータを第三者に読ませないための仕組みです。
システムへのアクセスは 2 段階で判定します。最初に相手が誰かを確かめるのが認証、次にその相手がその操作をしてよいかを決めるのが認可です。ログインできたのにファイルを消せないなら、認証は通って認可で止まっています。暗号化はこの判定とは別の守りで、通信の途中で盗み見られても、ディスクが持ち出されても、中身を読めなくします。Google Cloud では、認可を IAM (Identity and Access Management) が受け持ち、保存データは最初から暗号化されています。
認証で誰かを確かめ、認可で何をしてよいかを決める
認証 (authentication) は「あなたは誰か」を確かめる手続きで、パスワードの入力がその代表です。認可 (authorization) は「その人にこの操作を許すか」を、あらかじめ決めた権限の表と照らして決めます。順番は必ず認証が先です。相手が分からなければ、誰の権限を調べればよいかが決まらないからです。
Web では、どちらで止まったかが HTTP のステータスコードに出ます。RFC 9110 では、認証の情報がないか正しくないときは 401 (Unauthorized)、相手は分かったが許可しないときは 403 (Forbidden) を返すと決めています。401 の名前は Unauthorized ですが、意味は「認証が要る」です。
Google Cloud では、人は Google アカウントで、プログラムはサービスアカウントで認証します。そのあと IAM が、その相手にどのロール (許される操作をまとめたもの) が与えられているかを見て認可します。ロールは「プロジェクト全体」や「このバケットだけ」のようにリソースごとに与えるので、同じ人でもリソースによって結果が変わります。IAM の詳しい使い方は IAM の基本で扱います。
下のシミュレーターで、利用者、操作、ロールを変えて、どちらの段階で止まるかを確かめてください。
パスワードに別の種類の要素を足すのが多要素認証
認証に使える証拠は、知っているもの (パスワード、暗証番号)、持っているもの (スマートフォン、セキュリティキー)、本人の特徴 (指紋、顔) の 3 種類に分けられます。この分け方は米国 NIST の認証のガイドライン SP 800-63B にも出てきます。
多要素認証 (MFA) は、種類の違う要素を 2 つ以上組み合わせる方式です。パスワードが漏れても、攻撃者は手元にないスマートフォンの確認コードを入力できないので、ログインできません。パスワードを 2 つ聞くのは同じ種類の要素なので多要素になりません。Google アカウントでは「2 段階認証プロセス」の名前で設定できます。
パスワードはハッシュにして保存する
ハッシュ関数は、どんな長さのデータからも決まった長さの値 (ハッシュ値) を作る計算です。同じ入力からは必ず同じ値が出て、1 文字違うだけで値はまったく変わり、値から元のデータには戻せません。よく使われる SHA-256 は、入力によらず 256 ビットの値を出します。
サーバーはパスワードそのものを保存せず、ハッシュ値だけを保存します。ログインのときは、入力されたパスワードのハッシュ値を計算して、保存してある値と比べます。保存先が盗まれても、元のパスワードはすぐには分かりません。実際のシステムでは、利用者ごとのランダムな値 (ソルト) を足し、わざと計算に時間がかかる関数を使って、総当たりで探す手間を増やします。
ハッシュは暗号化とは違います。暗号化したデータは鍵があれば元に戻せますが、ハッシュ値は誰にも戻せません。ダウンロードしたファイルのハッシュ値を公開されている値と比べて、途中で書き換えられていないかを確かめる使い方もあります。
暗号化には共通鍵と公開鍵の 2 方式がある
暗号化は、鍵を使ってデータを第三者に読めない形 (暗号文) に変え、鍵を持つ人だけが元に戻せる (復号できる) ようにする仕組みです。鍵の持ち方で 2 つの方式に分かれます。
共通鍵暗号は、暗号化と復号に同じ鍵を使います。計算が速いので大量のデータに向き、AES が代表です。弱点は、同じ鍵を相手に安全に渡す方法が別に要ることです。
公開鍵暗号は、対になった 2 つの鍵を使います。公開鍵で暗号化したデータは、対になる秘密鍵でしか復号できません。公開鍵は誰に配ってもよいので、鍵を渡す問題が起きません。逆に秘密鍵で作った署名を公開鍵で検証すれば、送り手が本物かを確かめられます。代わりに計算が遅く、RSA や楕円曲線暗号が使われます。
HTTPS で使う TLS は 2 つを組み合わせます。公開鍵の仕組みでサーバーの証明書を確かめ、その通信だけで使う共通鍵を両者で決め、データ本体は速い共通鍵暗号で暗号化します。
通信中と保存中の 2 か所で暗号化する
データが狙われる場所は 2 つあります。ネットワークを流れている途中と、ディスクやストレージに置かれている間です。通信の暗号化 (in transit) は盗聴を、保存データの暗号化 (at rest) はディスクの持ち出しや保存先からの漏えいを防ぎます。片方だけでは、もう片方の場所が無防備になります。
Google Cloud は、保存する顧客のコンテンツを利用者が何もしなくても AES-256 で暗号化します (一部の古い Persistent Disk だけは AES-128。保存データのデフォルトの暗号化)。そのため PCA の問題で「保存データを暗号化したい」とだけ書かれていたら、追加の作業は要りません。鍵を自社で管理する、無効にできるようにする、といった要件があるときに鍵の管理方法を選びます。その選び方はセキュリティの設計で扱います。