IT の基礎

認証、認可、暗号化

システムへのアクセスは、相手が誰かを確かめる認証と、その相手に操作を許すかを決める認可の 2 段階で判定します。暗号化は、通信の途中と保存先の 2 か所でデータを第三者に読ませないための仕組みです。

システムへのアクセスは 2 段階で判定します。最初に相手が誰かを確かめるのが認証、次にその相手がその操作をしてよいかを決めるのが認可です。ログインできたのにファイルを消せないなら、認証は通って認可で止まっています。暗号化はこの判定とは別の守りで、通信の途中で盗み見られても、ディスクが持ち出されても、中身を読めなくします。Google Cloud では、認可を IAM (Identity and Access Management) が受け持ち、保存データは最初から暗号化されています。

認証で誰かを確かめ、認可で何をしてよいかを決める

認証 (authentication) は「あなたは誰か」を確かめる手続きで、パスワードの入力がその代表です。認可 (authorization) は「その人にこの操作を許すか」を、あらかじめ決めた権限の表と照らして決めます。順番は必ず認証が先です。相手が分からなければ、誰の権限を調べればよいかが決まらないからです。

Web では、どちらで止まったかが HTTP のステータスコードに出ます。RFC 9110 では、認証の情報がないか正しくないときは 401 (Unauthorized)、相手は分かったが許可しないときは 403 (Forbidden) を返すと決めています。401 の名前は Unauthorized ですが、意味は「認証が要る」です。

利用者認証誰かを確かめる認可権限を確かめるリソース401認証が必要403権限がない両方を通ると許可
認証を通らない要求は、認可の判定まで進まない。止まった段階によって返るコードが変わる

Google Cloud では、人は Google アカウントで、プログラムはサービスアカウントで認証します。そのあと IAM が、その相手にどのロール (許される操作をまとめたもの) が与えられているかを見て認可します。ロールは「プロジェクト全体」や「このバケットだけ」のようにリソースごとに与えるので、同じ人でもリソースによって結果が変わります。IAM の詳しい使い方は IAM の基本で扱います。

下のシミュレーターで、利用者、操作、ロールを変えて、どちらの段階で止まるかを確かめてください。

試すアクセスの判定

利用者
操作
対象のリソース
田中さんのロール (売上レポート)
田中さんのロール (顧客名簿)

誰か

認証

停止

してよいか

認可

判定しない

拒否HTTP 401

誰なのかが分からないので、認証の段階で止まります。権限を調べる相手が決まらないため、認可の判定には進みません。

パスワードに別の種類の要素を足すのが多要素認証

認証に使える証拠は、知っているもの (パスワード、暗証番号)、持っているもの (スマートフォン、セキュリティキー)、本人の特徴 (指紋、顔) の 3 種類に分けられます。この分け方は米国 NIST の認証のガイドライン SP 800-63B にも出てきます。

多要素認証 (MFA) は、種類の違う要素を 2 つ以上組み合わせる方式です。パスワードが漏れても、攻撃者は手元にないスマートフォンの確認コードを入力できないので、ログインできません。パスワードを 2 つ聞くのは同じ種類の要素なので多要素になりません。Google アカウントでは「2 段階認証プロセス」の名前で設定できます。

パスワードはハッシュにして保存する

ハッシュ関数は、どんな長さのデータからも決まった長さの値 (ハッシュ値) を作る計算です。同じ入力からは必ず同じ値が出て、1 文字違うだけで値はまったく変わり、値から元のデータには戻せません。よく使われる SHA-256 は、入力によらず 256 ビットの値を出します。

サーバーはパスワードそのものを保存せず、ハッシュ値だけを保存します。ログインのときは、入力されたパスワードのハッシュ値を計算して、保存してある値と比べます。保存先が盗まれても、元のパスワードはすぐには分かりません。実際のシステムでは、利用者ごとのランダムな値 (ソルト) を足し、わざと計算に時間がかかる関数を使って、総当たりで探す手間を増やします。

ハッシュは暗号化とは違います。暗号化したデータは鍵があれば元に戻せますが、ハッシュ値は誰にも戻せません。ダウンロードしたファイルのハッシュ値を公開されている値と比べて、途中で書き換えられていないかを確かめる使い方もあります。

暗号化には共通鍵と公開鍵の 2 方式がある

暗号化は、鍵を使ってデータを第三者に読めない形 (暗号文) に変え、鍵を持つ人だけが元に戻せる (復号できる) ようにする仕組みです。鍵の持ち方で 2 つの方式に分かれます。

共通鍵暗号 (例: AES)送り手鍵 K で暗号化暗号文鍵がないと読めない受け手同じ鍵 K で復号公開鍵暗号 (例: RSA)送り手受け手の公開鍵暗号文鍵がないと読めない受け手自分の秘密鍵で復号
共通鍵は両者が同じ鍵を持つ。公開鍵は暗号化の鍵を配ってよく、復号の鍵は受け手だけが持つ

共通鍵暗号は、暗号化と復号に同じ鍵を使います。計算が速いので大量のデータに向き、AES が代表です。弱点は、同じ鍵を相手に安全に渡す方法が別に要ることです。

公開鍵暗号は、対になった 2 つの鍵を使います。公開鍵で暗号化したデータは、対になる秘密鍵でしか復号できません。公開鍵は誰に配ってもよいので、鍵を渡す問題が起きません。逆に秘密鍵で作った署名を公開鍵で検証すれば、送り手が本物かを確かめられます。代わりに計算が遅く、RSA や楕円曲線暗号が使われます。

HTTPS で使う TLS は 2 つを組み合わせます。公開鍵の仕組みでサーバーの証明書を確かめ、その通信だけで使う共通鍵を両者で決め、データ本体は速い共通鍵暗号で暗号化します。

通信中と保存中の 2 か所で暗号化する

データが狙われる場所は 2 つあります。ネットワークを流れている途中と、ディスクやストレージに置かれている間です。通信の暗号化 (in transit) は盗聴を、保存データの暗号化 (at rest) はディスクの持ち出しや保存先からの漏えいを防ぎます。片方だけでは、もう片方の場所が無防備になります。

利用者サーバーディスクAES-256TLS書き込み通信の暗号化保存データの暗号化
通信の途中と保存先では、使う仕組みが違う。両方をそろえて初めてデータの通り道全体が守られる

Google Cloud は、保存する顧客のコンテンツを利用者が何もしなくても AES-256 で暗号化します (一部の古い Persistent Disk だけは AES-128。保存データのデフォルトの暗号化)。そのため PCA の問題で「保存データを暗号化したい」とだけ書かれていたら、追加の作業は要りません。鍵を自社で管理する、無効にできるようにする、といった要件があるときに鍵の管理方法を選びます。その選び方はセキュリティの設計で扱います。

理解度チェック

答えを開く前に、自分で考えてください。結果はこのブラウザにだけ残り、間違えた問題は復習のページでまとめて解き直せます。

思い出す

ログイン済みの利用者がファイルを削除しようとしたら、HTTP の 403 が返りました。認証と認可のどちらの段階で止まっていますか。401 が返るのはどんなときですか。

状況で選ぶ

社内システムのパスワードが漏れる事件が他社で続いています。要件は、利用者のパスワードが漏れても、他人がそのパスワードでログインできないようにすることです。何を足しますか。

説明する

PCA の問題文に「Cloud Storage に保存するデータを暗号化したい」とだけ要件があるとき、追加で何をすべきですか。鍵の管理方法を選ぶ必要が出てくるのはどんな要件があるときかも含めて説明してください。