セキュリティ対策の基本 #9 【Webセキュリティ ~ TLS/SSL】(覚え書き) 

セキュリティ

なぜHTTPだけでは危険なの?

普通のHTTP通信は、送受信されるデータが暗号化されないため、途中で盗み見られたり、改ざんされたりするリスクがあります。たとえば、銀行のサイトやオンラインショッピングでは、個人情報やクレジットカード情報を守る必要がありますね。

TLS/SSLで安全な通信

TLS(Transport Layer Security)/SSLは、WebブラウザとWebサーバ間の通信を暗号化するプロトコルです。具体的には:

  • ハイブリッド暗号方式
    • 共通鍵暗号(例:AES)でデータを高速に暗号化
    • 公開鍵暗号(例:RSA)でセッション鍵(共通鍵)のやりとりを安全に行う
  • デジタル証明書
    サーバは認証局から発行された証明書を使って自分の公開鍵を証明し、クライアントはこれを確認して正当性を判断します。

Pythonで見るSSL接続のサンプル

以下のコード例では、Pythonの標準ライブラリを使って、SSL接続の基本的な流れ(サーバの証明書取得など)を実演しています:

import ssl
import socket

hostname = 'www.example.com'
port = 443

# デフォルトのSSLコンテキストを作成
context = ssl.create_default_context()

# ソケットを作成してSSLラップ
with socket.create_connection((hostname, port)) as sock:
    with context.wrap_socket(sock, server_hostname=hostname) as ssock:
        print("SSLバージョン:", ssock.version())
        print("サーバ証明書:")
        for key, value in ssock.getpeercert().items():
            print(f"  {key}: {value}")

このコードは、指定したホスト(ここでは例として www.example.com)にSSL/TLSで接続し、サーバの証明書情報を出力します。実際のWeb通信では、これによりクライアント側でサーバの正当性をチェックできる仕組みになっています。

電子メールセキュリティ ~ S/MIME と PGP の世界

メールはそのままだと危険!?

電子メールは、SMTPなどのプロトコルを使って送信されますが、基本的には暗号化されずに送られてしまいます。これにより、メール内容が第三者に覗かれたり、途中で改ざんされたりする危険性があります。

S/MIMEで守るメールの秘密

S/MIME(Secure Multipurpose Internet Mail Extensions)は、以下のような仕組みでメールのセキュリティを強化します:

  • 電子署名
    送信者はまず、メールのハッシュ値(メッセージダイジェスト)を作成し、それを自分の秘密鍵で暗号化して電子署名を生成します。受信者は送信者の公開鍵を使って署名を検証することで、改ざんやなりすましを防ぎます。
  • 暗号化
    メール内容自体は共通鍵(セッション鍵)で暗号化され、そのセッション鍵は受信者の公開鍵で暗号化して送られます。

Pythonでハッシュ値を計算してみよう!

以下の例では、Pythonのhashlibモジュールを使って、メッセージのハッシュ値(SHA-256)を計算する簡単なコードを紹介します。実際のS/MIMEでは、このハッシュ値に秘密鍵で署名を行います。

import hashlib

message = b"Hello, secure world!"
# SHA-256ハッシュを計算
digest = hashlib.sha256(message).hexdigest()
print("メッセージダイジェスト:", digest)

このコードは、メッセージのダイジェスト(要約)を生成し、改ざん検出の基本となるデジタル署名の元になる部分を示しています。

リモートアクセスの守り神 ~ SSH で安全に接続 ~

Telnetはもう古い!?

昔はTelnetというプロトコルでリモートからコンピュータにアクセスしていましたが、Telnetはデータが暗号化されずに送信されるため、パスワードやコマンドが盗まれてしまうリスクがありました。

SSHで守る安全なリモートアクセス

SSH(Secure SHell)は、Telnetの問題を解決するために登場しました。SSHは以下の特徴を持ちます:

  • 暗号化通信
    通信内容はセッション鍵を用いて暗号化されるため、第三者に内容が漏れる心配がありません。
  • 公開鍵認証
    サーバは自分の公開鍵をクライアントに提示し、クライアントはその正当性を確認します。これにより、なりすましのリスクが軽減されます。

PythonでSSH接続のサンプル(Paramikoを使用)

Pythonの人気ライブラリ「Paramiko」を使えば、SSH接続を簡単に実現できます。以下は基本的な接続例です:

import paramiko

hostname = 'your.ssh.server'
username = 'your_username'
password = 'your_password'

# SSHクライアントの作成
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

try:
    client.connect(hostname, username=username, password=password)
    stdin, stdout, stderr = client.exec_command('ls -l')
    output = stdout.read().decode()
    print("リモートサーバ上のファイル一覧:")
    print(output)
finally:
    client.close()

このコードは、指定したサーバにSSHで接続し、ls -lコマンドを実行してその結果を表示します。セキュリティ上、パスワードや鍵の管理には十分注意しましょう。

まとめ

  • Web通信では、HTTPの平文通信の危険性を回避するため、TLS/SSLを使って通信内容を暗号化。
  • 電子メールは、S/MIMEやPGPの技術を利用して、電子署名や暗号化を行うことで安全性を高める。
  • リモートアクセスには、Telnetの代わりにSSHを使うことで、認証や通信の暗号化を実現。

どの分野でも、暗号技術(共通鍵・公開鍵暗号)やデジタル証明書、ハッシュ関数などを組み合わせることで、情報漏洩や不正アクセスのリスクを軽減しています。現代のセキュリティは、まるで魔法のように多層的な防御で守られているのです!

さあ、今日からあなたもこの知識を活かして、安全なインターネットライフを楽しんでくださいね。​

コメント