愛記システムの基本設計:DApps側である愛記システム データのセキュリティ ログと監査 | 続・ティール組織 研究会のブログ

続・ティール組織 研究会のブログ

ティール組織が話題になっているが、具現化するにはどうしたらよいか?
その研究を続けるにあたり、さらに次の形態である、続・ティール組織なるものまで視野に入れ、具体的な施策・行動内容を研究・支援する会。

先までは、"愛記"についての記載で、どのようにブロックチェーンSNSに組み込んで実装していけばよいのか、概念的なところからアプローチ方法を記載していった。概念設計としてはひとまず終えた。次は、フェデレーションモデル全体の基本設計といえるところまで、基本設計書に着手できるようなところまで、概念を具体化していきたい。そして、それにつながるDApps側である「愛記システム」を、Pythonプログラムで開発していきたい。

 

愛の行動のPL,BSを決算書として、個人単位、市町村単位、で公表するような愛記システムというものを考えている。愛の行動のデータベースはブロックチェーンのプログラムであり、日々の愛の行動による愛貨の移動を決算書にまとめていきたい。なお、市町村のブロックチェーンのプログラムは以前にも記載している。その市町村のブロックチェーンのプログラムにつながる愛記システムを、DApps側であるPythonプログラムとして設計したい。その場合、基本設計をどのような手順で進めていけばよいか、詳しく見ていこう。

 

愛記システムを設計するための基本手順を以下に示す。このシステムは、Pythonを用いて市町村のブロックチェーンと連携し、個人および市町村単位での愛の行動のデータを収集、記録し、決算書(PL、BS)として公表するものである。

基本設計のステップ

  1. 要件定義
  2. アーキテクチャ設計
  3. データベース設計
  4. API設計
  5. ブロックチェーンインターフェース
  6. 決算書の生成
  7. フロントエンド開発
  8. テストとデプロイ

基本設計の各ステップを順番に進めることで、ブロックチェーンとDAppsとして繋がる「愛記システム」の詳細な設計が可能になる。各ステップでは、関係者との協議やレビューを通じて設計内容を確定していくことが重要である。

1.要件定義

まず、基本設計の最初のステップである要件定義をしていきたい。どのような機能が必要か、どのような問題を解決するのかを洗い出したい。要件定義はシステム設計の最初の重要なステップであり、システムが解決するべき問題と、必要な機能を明確に定義するプロセスである。以下に、愛記システムのプログラムに必要な機能と解決すべき問題を列挙してみよう。

機能要件

  1. 愛の行動の記録

  2. 愛貨の移動の記録

  3. 決算書の生成

  4. 個人および市町村単位でのデータの集約

  5. データのブロックチェーンへの記録と取得

  6. 愛貨の管理

  7. ユーザー管理

  8. 通知機能

  9. レポート機能

  10. ダッシュボード

非機能要件

  1. セキュリティ

  2. 可用性

  3. パフォーマンス

  4. スケーラビリティ

  5. ユーザビリティ

  6. コンプライアンス

解決すべき問題

  1. 透明性と信頼性の確保

  2. データの一元管理

  3. 愛の行動の促進

  4. 評価制度の確立

  5. データのセキュリティとプライバシーの保護

これらの要件を基に、愛記システムの基本設計を進めていくことが重要である。次のステップでは、これらの要件を具体的なアーキテクチャ設計に反映していくことになる。まずは、要件定義の解決すべき問題を一つずつクリアにしていきたい。

データのセキュリティとプライバシーの保護

次は、データのセキュリティとプライバシーの保護について、今まで記載してきたフェデレーションモデルにおけるブロックチェーンのプログラムとそれに紐付くDApps側であるPythonプログラムにおいて、特にDApps側であるPythonプログラムのデータのセキュリティとプライバシーの保護について、設計していこう。以下は、DApps側であるPythonプログラムのセキュリティとプライバシー保護の設計についての詳細である。

・セキュリティとプライバシー保護のための基本方針

  1. データの暗号化:

    • データベースに保存する際に、機密情報は暗号化して保存する。
    • 通信中のデータもTLS/SSLを使用して暗号化する。
  2. 認証と認可:

    • APIエンドポイントへのアクセスには、トークンベースの認証を導入する。
    • 各エンドポイントに適切なアクセス制御を設定する。
  3. データの最小化:

    • 必要最小限のデータのみを収集・保存し、不要なデータは収集しないようにする。
  4. ログと監査:

    • システムの操作ログを記録し、定期的に監査する。
  5. 定期的なセキュリティレビュー:

    • コードやインフラストラクチャの定期的なセキュリティレビューを実施する。
       

操作ログの設計

1. ログ項目の設計

操作ログには、以下の情報を含めることで効果的に監視を行える:

  • 日時 (Timestamp): アクションが行われた正確な日時を記録する。これは時系列分析や特定の時間帯における異常を発見するのに重要である。

  • ユーザーID (User ID): アクションを実行したユーザーのIDを記録する。これにより、特定のユーザーの行動を追跡できる。

  • IPアドレス (IP Address): アクションが行われたクライアントのIPアドレスを記録する。これにより、不審なアクセス元を特定できる。

  • 操作内容 (Action): 実行された具体的な操作の内容を記録する。例: ログイン、データ更新、データ削除など。

  • 対象リソース (Resource): 操作対象のリソース(例: データベースの特定のエントリやファイル)の識別情報を記録する。

  • 結果 (Result): 操作が成功したか、失敗したかを記録する。失敗した場合、エラーメッセージや例外情報も含める。

  • デバイス情報 (Device Info): 操作が行われたデバイスやブラウザの情報を記録する。これにより、特定のデバイスでの異常を発見できる。
     

2. ログのフォーマット

ログを記録する際のフォーマットを決める。一般的にはJSON形式やCSV形式がよく使われる。

・JSONフォーマット:

{
  "timestamp": "2024-08-02T12:34:56Z",
  "user_id": "user123",
  "ip_address": "192.168.1.10",
  "action": "login",
  "resource": "/api/login",
  "result": "success",
  "device_info": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36"
}
 

3. ログの保存場所

ログデータは信頼性の高いストレージに保存する必要がある。考慮すべき保存先は以下の通り:

  • データベース: MongoDBのようなNoSQLデータベースに保存することで、ログデータを簡単に検索・解析できる。

  • ファイルシステム: ローカルまたはリモートのファイルシステムにログを保存することも可能。例: AWS S3やAzure Blob Storage。

  • ログ管理ツール: ELKスタック(Elasticsearch、Logstash、Kibana)やSplunkなどの専用ツールを使用すると、ログの収集・分析がより効率的に行える。
     

4. ログの収集

Pythonのloggingモジュールを使用して、Flaskアプリケーション内でログを収集する。

import logging
from flask import Flask, request

app = Flask(__name__)

# ログの設定
logging.basicConfig(filename='app.log', level=logging.INFO, 
                    format='%(asctime)s %(levelname)s %(message)s')

@app.before_request
def log_request_info():
    logging.info({
        'timestamp': datetime.utcnow().isoformat(),
        'user_id': request.headers.get('User-ID'),
        'ip_address': request.remote_addr,
        'action': request.endpoint,
        'resource': request.path,
        'device_info': request.user_agent.string
    })

@app.after_request
def log_response_info(response):
    logging.info({
        'timestamp': datetime.utcnow().isoformat(),
        'action': request.endpoint,
        'result': response.status_code
    })
    return response
 

5. ログの保持期間と削除ポリシー

  • 保持期間: どのくらいの期間ログを保持するかを決定する。一般的には90日から180日程度。

  • 削除ポリシー: 保持期間を超えたログは自動的に削除する仕組みを設定する。例: 定期的なバッチ処理で古いログを削除。

 

次に、監査の設計について記載したい。監査の目的は、システム内の操作ログを定期的にチェックし、不正行為や異常な動作を検出することである。以下に、監査の設計プロセスを説明する。

監査の設計

1. 監査の目的と範囲

  • 目的: システムの操作ログを監査することで、不正行為、セキュリティ侵害、異常な動作を早期に発見し、対策を講じること。
  • 範囲: 全ユーザー、APIエンドポイント、データベース操作、システム設定変更など、システム内のすべての重要なアクションを対象とする。

2. 監査ログの設計

監査ログに含まれるべき項目を明確に定義する。これにより、監査の効果を最大化する。

  • 日時 (Timestamp): 各操作が行われた日時を記録。
  • ユーザーID (User ID): 操作を行ったユーザーのIDを記録。
  • アクションタイプ (Action Type): 操作の種類(例: ログイン、データ変更、設定変更など)を記録。
  • リソース (Resource): 操作の対象となったリソースやデータ(例: データベースのテーブル名、APIエンドポイント)を記録。
  • 結果 (Result): 操作が成功したか失敗したかの結果を記録。
  • IPアドレス (IP Address): 操作を行ったユーザーのIPアドレスを記録。
  • 変更内容 (Changes): もしあれば、操作による具体的な変更内容を記録。

3. 監査プロセスの設計

監査を定期的に行うためのプロセスを設計する。

  1. ログの収集:

    • ログはリアルタイムで収集され、専用の監査ログデータベースに保存。
    • Pythonのloggingモジュールを使ってログを記録。
  2. 自動監査:

    • 定期的な監査スクリプトを実行して、異常を自動的に検出。
    • スクリプトはログファイルを解析し、設定されたルールに基づいてアラートを生成。
  3. 手動監査:

    • 月次または週次の監査会議を開き、手動でログをレビュー。
    • セキュリティチームはログを分析し、不正行為の兆候を探す。
  4. 監査報告:

    • 監査の結果は定期的に報告書としてまとめられ、経営陣やIT部門に提出する。
    • 報告書には検出された問題、推奨される対策、今後の改善策が含まれる。
  5. アラートシステム:

    • 異常なアクションが検出された場合、アラートが生成され、管理者に通知。
    • 通知は電子メール、SMS、またはシステムダッシュボードで行う。

4. 監査ルールの定義

監査ルールは、異常を検出するための基準を定義する。

  • 異常なログイン試行: 一定時間内に特定の回数以上のログイン失敗があった場合にアラートを生成。
  • 不正なデータアクセス: 特定のデータベーステーブルへの異常なアクセスを監視。
  • 権限の不正使用: ユーザーが不正に管理者権限を使用した場合にアラートを生成。

5. セキュリティとプライバシーの考慮

  • データの暗号化: 監査ログデータはAES-256などの強力な暗号化アルゴリズムを使用して暗号化する。
  • アクセス制御: 監査ログにアクセスできるユーザーを制限し、必要な権限を持つ者のみがログを閲覧できるようにする。

・実装: Pythonでの操作ログ記録

import logging
from flask import Flask, request

app = Flask(__name__)

# ログファイルの設定
logging.basicConfig(
    filename='audit.log',
    level=logging.INFO,
    format='%(asctime)s %(levelname)s %(message)s'
)

# 操作ログの記録
@app.before_request
def log_request_info():
    user_id = request.headers.get('User-ID', 'Unknown')
    action_type = request.endpoint
    ip_address = request.remote_addr
    logging.info(f"User {user_id} accessed {action_type} from IP {ip_address}")

@app.after_request
def log_response_info(response):
    status_code = response.status_code
    logging.info(f"Response status: {status_code}")
    return response

@app.route('/login', methods=['POST'])
def login():
    data = request.json
    user_id = data.get('user_id')
    # パスワードの検証
    logging.info(f"User {user_id} attempted login.")
    # ログイン処理
    return "Login Successful"

if __name__ == '__main__':
    app.run(debug=True)
 

・ログの監査スクリプト

import logging

def audit_log_analysis(log_file):
    suspicious_activities = []
    with open(log_file, 'r') as f:
        for line in f:
            if 'failed login' in line:
                suspicious_activities.append(line)
            if 'unauthorized access' in line:
                suspicious_activities.append(line)

    return suspicious_activities

if __name__ == '__main__':
    suspicious_logs = audit_log_analysis('audit.log')
    if suspicious_logs:
        print("Suspicious activities found:")
        for log in suspicious_logs:
            print(log)
    else:
        print("No suspicious activities found.")
 

・定期的な監査と報告

  • 実行頻度: 月次または週次で監査を実施。
  • 監査ツール: 上記の監査スクリプトを実行して、異常をチェック。
  • 報告書の作成: 結果を基に報告書を作成し、必要に応じて対策を提案する。

この設計により、システムの操作ログを効率的に記録し、定期的な監査を通じてセキュリティと信頼性を向上させることができる。

 

 

いかがであろうか、これでDApps側であるPythonプログラムのデータのログと監査ができた。セキュリティは一つずつ強固に設定していくことが重要であろうから。次回は、レビューについて見ていきたい。