PowerShellでCisco Umbrellaのポリシーを効率的に管理しDNSセキュリティを強化する方法

PowerShellとCisco Umbrellaは、ネットワーク管理者にとって強力なツールの組み合わせです。Cisco Umbrellaは、DNSレイヤーでのセキュリティを提供し、マルウェアや不正なWebサイトへのアクセスを防ぎます。一方、PowerShellは自動化とスクリプトによる効率的な管理を可能にします。本記事では、PowerShellを活用してCisco Umbrellaのポリシーを一括管理し、DNSセキュリティを強化する具体的な方法を解説します。これにより、セキュリティ管理の効率化と精度向上を同時に実現する方法を学べます。

目次

Cisco Umbrellaとは何か


Cisco Umbrellaは、クラウドベースのDNSセキュリティプラットフォームです。インターネットトラフィックをDNSレイヤーで監視・制御し、悪意のあるWebサイトやフィッシング攻撃へのアクセスを防止することで、ネットワーク全体のセキュリティを強化します。

主な機能


Cisco Umbrellaの主な機能には以下があります。

  • DNSフィルタリング:不正なドメインやカテゴリベースでのアクセス制御を実施。
  • セキュリティレポート:詳細なトラフィック解析と脅威の可視化を提供。
  • モバイルデバイスの保護:リモートワーカーやモバイルユーザーのセキュリティを確保。

DNSセキュリティの仕組み


Cisco Umbrellaは、インターネットリクエストを解析し、安全でないドメインやIPアドレスへのアクセスをブロックします。この仕組みにより、マルウェアやランサムウェアなどの脅威を事前に防ぐことが可能です。

なぜCisco Umbrellaが重要なのか


従来型のネットワークセキュリティは、社内ネットワーク内にいるデバイスにしか対応できません。一方でCisco Umbrellaは、クラウドベースの特性を活かし、あらゆる場所のデバイスに対して統一されたセキュリティポリシーを適用できます。これにより、分散化が進む現代の働き方やネットワーク環境に適したセキュリティを提供します。

Cisco Umbrellaは、DNSを介した包括的なセキュリティ基盤を提供し、脅威への迅速な対応を可能にする重要なツールです。

PowerShellを活用するメリット

PowerShellは、Cisco Umbrellaを効率的に管理するための強力なツールです。特に、手動操作を最小限に抑え、自動化と一括管理を実現する点で優れています。以下では、PowerShellを活用する具体的なメリットを紹介します。

自動化による効率化


PowerShellはスクリプトベースで動作するため、繰り返し行う操作を自動化できます。これにより、以下のような効率化が可能です:

  • ポリシーの一括適用:複数の設定を一度に反映。
  • 定期的な監査:スクリプトをスケジュール化し、自動で設定状態をチェック。
  • 設定の再利用:汎用性のあるスクリプトを作成して他の環境でも活用可能。

作業ミスの削減


手作業での設定は、人為的ミスが発生する可能性があります。PowerShellスクリプトを使用することで、設定内容を確実に適用し、設定漏れや入力ミスを防げます。

迅速なトラブルシューティング


PowerShellはリアルタイムでログや設定情報を取得できるため、問題の原因を特定する作業がスムーズに行えます。APIを通じてCisco Umbrellaのデータを直接取得することで、正確な情報に基づいたトラブルシューティングが可能です。

柔軟性と拡張性


PowerShellは、モジュールやスクリプトの形で機能を拡張できます。Cisco Umbrella APIと連携するスクリプトを作成することで、次のような柔軟な管理が可能です:

  • カスタムダッシュボードの構築
  • 特定の条件下でのポリシー変更
  • 外部ツールとの連携

複雑な操作の簡素化


複雑な設定や操作を簡素化し、わかりやすい手順で実行できるようになります。たとえば、スクリプトを作成することで、非エンジニアでも簡単に設定を変更できる環境を構築できます。

PowerShellを活用することで、Cisco Umbrellaの管理がより効率的で正確になります。特に、運用規模が大きい環境において、その効果は顕著に表れます。

PowerShell環境の準備

PowerShellを使ってCisco Umbrellaを管理するには、適切な環境設定が重要です。ここでは、必要なツールやモジュールのインストール手順、初期設定の方法について詳しく解説します。

PowerShellのバージョン確認と更新


PowerShellの最新バージョンを使用することで、最新の機能やセキュリティ改善を利用できます。以下の手順でバージョンを確認し、必要に応じて更新します。

  1. PowerShellを起動し、次のコマンドを実行してバージョンを確認します。
   $PSVersionTable.PSVersion
  1. 最新版でない場合、PowerShell公式サイトから最新バージョンをダウンロードし、インストールします。

必要なモジュールのインストール


Cisco Umbrella APIを利用するためには、HTTPリクエストやJSON処理が必要です。以下のモジュールをインストールします:

  1. PSReadLine:コマンド補完機能の向上。
   Install-Module -Name PSReadLine -Force
  1. Invoke-RestMethod:HTTPリクエストを送信するための組み込みコマンドレットを使用。
    追加インストールは不要ですが、PowerShellのバージョンが最新であることを確認してください。
  2. JSON モジュール:JSON形式のデータを処理するための機能。PowerShellには標準で組み込まれています。

APIキーの取得と管理


Cisco Umbrella APIを利用するには、APIキーが必要です。以下の手順で取得します。

  1. Cisco Umbrellaダッシュボードにログインします。
  2. 「APIキー管理」セクションで新しいキーを生成します。
  3. 生成されたキーを安全な場所に保存します(例:環境変数やセキュアなキーファイル)。

環境変数に保存する例:

[System.Environment]::SetEnvironmentVariable("UmbrellaAPIKey", "your-api-key", "User")

接続確認


PowerShellでCisco Umbrella APIに接続できるか確認します。以下は接続テスト用の基本スクリプトです:

$APIKey = [System.Environment]::GetEnvironmentVariable("UmbrellaAPIKey", "User")
$BaseUrl = "https://management.api.umbrella.com/v1/"
$response = Invoke-RestMethod -Uri $BaseUrl -Headers @{ "Authorization" = "Bearer $APIKey" }

if ($response) {
    Write-Host "API接続に成功しました。" -ForegroundColor Green
} else {
    Write-Host "API接続に失敗しました。" -ForegroundColor Red
}

注意事項

  • 必ずAPIキーを安全な場所に保管し、不必要な共有を避けてください。
  • スクリプト実行環境に管理者権限が必要な場合があります。

これらの準備を完了すれば、PowerShellでCisco Umbrellaを利用するための基盤が整います。次のステップでは、APIを使った実際の操作について解説します。

Cisco Umbrella APIの概要

Cisco Umbrella APIは、ポリシー管理やレポート生成などの操作を自動化するために提供されているインターフェースです。PowerShellと組み合わせることで、効率的なDNSセキュリティ管理が可能になります。ここでは、APIの基本情報と認証方法について説明します。

Cisco Umbrella APIの主な機能


Cisco Umbrella APIは、以下のような操作をサポートしています:

  • ポリシー管理:DNSフィルタリングルールやホワイトリスト、ブラックリストの作成・更新。
  • トラフィックレポートの取得:セキュリティログや統計情報の収集。
  • 組織の設定管理:DNSサーバーやネットワーク情報の設定変更。

これらの機能により、大規模なネットワークでも効率的な管理が可能になります。

APIエンドポイントの構造


Cisco Umbrella APIはRESTfulな構造を採用しています。以下は典型的なエンドポイントの例です:

  • ポリシーの一覧取得
  GET https://management.api.umbrella.com/v1/policies
  • 新しいポリシーの作成
  POST https://management.api.umbrella.com/v1/policies
  • 特定ポリシーの更新
  PUT https://management.api.umbrella.com/v1/policies/{policyId}

認証方法


APIにアクセスするには、事前に取得したAPIキーを使用して認証を行います。Cisco Umbrella APIでは、Bearer Token認証を採用しています。以下に認証手順を説明します:

  1. APIキーの準備
    Cisco UmbrellaダッシュボードでAPIキーを生成し、セキュアに保管します。
  2. PowerShellでの認証
    APIキーをヘッダーに含めてリクエストを送信します。以下はその例です:
   $APIKey = [System.Environment]::GetEnvironmentVariable("UmbrellaAPIKey", "User")
   $Headers = @{ "Authorization" = "Bearer $APIKey" }
  1. 接続テスト
    以下のコードを使用して接続をテストします:
   $BaseUrl = "https://management.api.umbrella.com/v1/policies"
   $Response = Invoke-RestMethod -Uri $BaseUrl -Headers $Headers -Method Get

   if ($Response) {
       Write-Host "APIに正常に接続できました。" -ForegroundColor Green
   } else {
       Write-Host "接続エラーが発生しました。" -ForegroundColor Red
   }

リクエストフォーマット


Cisco Umbrella APIでは、以下の形式でデータを送信します:

  • リクエストヘッダー
  • Content-Type: application/json
  • Authorization: Bearer {APIキー}
  • リクエストボディ(POST/PUTの場合)
    JSON形式でデータを送信します。例:
  {
      "name": "NewPolicy",
      "rules": [
          {
              "action": "block",
              "criteria": "category",
              "value": "Malware"
          }
      ]
  }

API使用時の注意点

  • レート制限:APIにはリクエスト数の制限があります(公式ドキュメントで確認してください)。
  • エラーハンドリング:適切なエラー処理を行い、ステータスコードを確認してください。

Cisco Umbrella APIを理解することで、PowerShellを用いた効率的なポリシー管理が可能になります。次のセクションでは、具体的なスクリプト例を紹介します。

実際のPowerShellスクリプト例

ここでは、Cisco Umbrellaポリシーを管理するための実際のPowerShellスクリプトを紹介します。このスクリプトは、ポリシー一覧の取得、新規ポリシーの作成、および既存ポリシーの更新を行う基本的な例です。

事前準備


以下を用意しておく必要があります:

  • Cisco Umbrella APIキー(環境変数として保存済み)
  • PowerShellの実行環境

ポリシー一覧を取得するスクリプト


ポリシーの一覧を取得し、画面に表示するスクリプトです。

# APIキーとエンドポイントの設定
$APIKey = [System.Environment]::GetEnvironmentVariable("UmbrellaAPIKey", "User")
$Headers = @{ "Authorization" = "Bearer $APIKey" }
$BaseUrl = "https://management.api.umbrella.com/v1/policies"

# ポリシー一覧の取得
try {
    $Response = Invoke-RestMethod -Uri $BaseUrl -Headers $Headers -Method Get
    if ($Response) {
        Write-Host "ポリシー一覧:" -ForegroundColor Green
        $Response.policies | ForEach-Object {
            Write-Host "ID: $_.id, Name: $_.name, Status: $_.status"
        }
    }
} catch {
    Write-Host "エラーが発生しました: $_" -ForegroundColor Red
}

新しいポリシーを作成するスクリプト


新しいポリシーを作成するスクリプトの例です。

# 新しいポリシーの情報
$NewPolicy = @{
    name = "NewPolicyExample"
    rules = @(
        @{
            action = "block"
            criteria = "category"
            value = "Malware"
        }
    )
} | ConvertTo-Json -Depth 10

# APIエンドポイント
$CreateUrl = "https://management.api.umbrella.com/v1/policies"

# ポリシー作成リクエスト
try {
    $Response = Invoke-RestMethod -Uri $CreateUrl -Headers $Headers -Method Post -Body $NewPolicy -ContentType "application/json"
    Write-Host "新しいポリシーが作成されました: $($Response.id)" -ForegroundColor Green
} catch {
    Write-Host "ポリシー作成に失敗しました: $_" -ForegroundColor Red
}

既存ポリシーを更新するスクリプト


特定のポリシーを更新するスクリプト例です。

# 更新対象のポリシーID
$PolicyId = "12345678"
$UpdatePolicy = @{
    name = "UpdatedPolicyExample"
    rules = @(
        @{
            action = "allow"
            criteria = "domain"
            value = "example.com"
        }
    )
} | ConvertTo-Json -Depth 10

# APIエンドポイント
$UpdateUrl = "https://management.api.umbrella.com/v1/policies/$PolicyId"

# ポリシー更新リクエスト
try {
    $Response = Invoke-RestMethod -Uri $UpdateUrl -Headers $Headers -Method Put -Body $UpdatePolicy -ContentType "application/json"
    Write-Host "ポリシーが更新されました: $PolicyId" -ForegroundColor Green
} catch {
    Write-Host "ポリシー更新に失敗しました: $_" -ForegroundColor Red
}

スクリプト実行時の注意点

  • エラーハンドリングを組み込むことで、API呼び出しの失敗時に詳細情報を確認できます。
  • JSON形式でデータを送信する場合、構造が正しいことを確認してください。
  • 実行時に不要な変更が加わらないよう、まずはテスト環境でスクリプトを実行してください。

このスクリプトを基に、環境に応じたカスタマイズを行い、効率的なポリシー管理を実現してください。

ポリシーの一括管理手法

PowerShellを使用してCisco Umbrellaポリシーを一括管理することで、大量の設定を短時間で効率的に適用できます。このセクションでは、ポリシーを一括で作成、更新、削除する具体的な手法を紹介します。

一括操作のメリット

  • 作業時間の短縮:複数のポリシーを一度に操作可能。
  • 一貫性の確保:同じルールを複数のポリシーに正確に適用できる。
  • エラーの削減:手動設定によるミスを防ぎ、ログで変更を追跡可能。

ポリシー一括作成スクリプト


CSVファイルを使用して複数のポリシーを一括作成する例です。

  1. CSVファイルの準備
    CSVファイル(policies.csv)に新しいポリシーの情報を記載します。
   name,action,criteria,value
   Policy1,block,category,Malware
   Policy2,allow,domain,example.com
   Policy3,block,category,Phishing
  1. スクリプト例
    CSVファイルを読み込み、一括作成します。
   # API設定
   $APIKey = [System.Environment]::GetEnvironmentVariable("UmbrellaAPIKey", "User")
   $Headers = @{ "Authorization" = "Bearer $APIKey" }
   $BaseUrl = "https://management.api.umbrella.com/v1/policies"

   # CSVの読み込み
   $Policies = Import-Csv -Path "policies.csv"

   # ポリシーの一括作成
   foreach ($Policy in $Policies) {
       $Body = @{
           name = $Policy.name
           rules = @(
               @{
                   action = $Policy.action
                   criteria = $Policy.criteria
                   value = $Policy.value
               }
           )
       } | ConvertTo-Json -Depth 10

       try {
           $Response = Invoke-RestMethod -Uri $BaseUrl -Headers $Headers -Method Post -Body $Body -ContentType "application/json"
           Write-Host "ポリシーが作成されました: $($Policy.name)" -ForegroundColor Green
       } catch {
           Write-Host "エラー: $($Policy.name) の作成に失敗しました。" -ForegroundColor Red
       }
   }

ポリシー一括更新スクリプト


既存ポリシーの一括更新もCSVで行えます。

  1. CSVファイルの準備
    更新対象のポリシーIDと新しい設定を記載します。
   id,name,action,criteria,value
   12345,UpdatedPolicy1,allow,domain,updated-example.com
   67890,UpdatedPolicy2,block,category,Malware
  1. スクリプト例
   # CSVの読み込み
   $PoliciesToUpdate = Import-Csv -Path "update_policies.csv"

   # ポリシーの一括更新
   foreach ($Policy in $PoliciesToUpdate) {
       $UpdateUrl = "https://management.api.umbrella.com/v1/policies/$($Policy.id)"
       $Body = @{
           name = $Policy.name
           rules = @(
               @{
                   action = $Policy.action
                   criteria = $Policy.criteria
                   value = $Policy.value
               }
           )
       } | ConvertTo-Json -Depth 10

       try {
           $Response = Invoke-RestMethod -Uri $UpdateUrl -Headers $Headers -Method Put -Body $Body -ContentType "application/json"
           Write-Host "ポリシーが更新されました: $($Policy.name)" -ForegroundColor Green
       } catch {
           Write-Host "エラー: $($Policy.name) の更新に失敗しました。" -ForegroundColor Red
       }
   }

ポリシー一括削除スクリプト


ポリシーIDリストを元に、一括削除する方法です。

  1. IDリストの準備
    削除対象ポリシーIDをテキストファイル(delete_ids.txt)に記載します。
   12345
   67890
   54321
  1. スクリプト例
   # 削除対象IDの読み込み
   $PolicyIds = Get-Content -Path "delete_ids.txt"

   # ポリシーの一括削除
   foreach ($PolicyId in $PolicyIds) {
       $DeleteUrl = "https://management.api.umbrella.com/v1/policies/$PolicyId"

       try {
           Invoke-RestMethod -Uri $DeleteUrl -Headers $Headers -Method Delete
           Write-Host "ポリシーが削除されました: $PolicyId" -ForegroundColor Green
       } catch {
           Write-Host "エラー: $PolicyId の削除に失敗しました。" -ForegroundColor Red
       }
   }

注意事項

  • 一括処理は設定変更が大規模に影響するため、テスト環境で十分に検証した後に実行してください。
  • APIのリクエスト回数制限に注意し、必要に応じてリクエスト間に待機時間を設けてください。

これらのスクリプトを活用することで、Cisco Umbrellaポリシーを効率的に一括管理できます。

DNSレイヤーセキュリティ強化の実践例

ここでは、Cisco UmbrellaとPowerShellを活用した具体的なDNSレイヤーセキュリティ強化の実践例を紹介します。以下のシナリオを基に、セキュリティポリシーの作成と適用を進めます。

シナリオ1: マルウェアドメインのブロック

企業ネットワークでマルウェアに感染するリスクを減らすため、マルウェア関連のカテゴリやドメインをブロックします。

  1. ポリシー設定のスクリプト例
    以下のスクリプトで、マルウェアカテゴリをブロックするポリシーを作成します。
   $APIKey = [System.Environment]::GetEnvironmentVariable("UmbrellaAPIKey", "User")
   $Headers = @{ "Authorization" = "Bearer $APIKey" }
   $BaseUrl = "https://management.api.umbrella.com/v1/policies"

   $PolicyBody = @{
       name = "BlockMalware"
       rules = @(
           @{
               action = "block"
               criteria = "category"
               value = "Malware"
           }
       )
   } | ConvertTo-Json -Depth 10

   try {
       $Response = Invoke-RestMethod -Uri $BaseUrl -Headers $Headers -Method Post -Body $PolicyBody -ContentType "application/json"
       Write-Host "マルウェアブロックポリシーが作成されました: $($Response.id)" -ForegroundColor Green
   } catch {
       Write-Host "ポリシー作成に失敗しました。" -ForegroundColor Red
   }
  1. 効果の確認
    マルウェア関連のWebサイトへアクセスしようとすると、DNSでブロックされることを確認します。Umbrellaダッシュボードでトラフィックレポートを確認し、ブロックが機能していることを確認してください。

シナリオ2: ホワイトリストの設定

誤検知やビジネス上の必要により、特定のドメインを許可する必要がある場合があります。

  1. ポリシーの追加スクリプト例
    以下のスクリプトで、許可するドメインをホワイトリストに追加します。
   $PolicyBody = @{
       name = "AllowTrustedDomain"
       rules = @(
           @{
               action = "allow"
               criteria = "domain"
               value = "trusted-domain.com"
           }
       )
   } | ConvertTo-Json -Depth 10

   try {
       $Response = Invoke-RestMethod -Uri $BaseUrl -Headers $Headers -Method Post -Body $PolicyBody -ContentType "application/json"
       Write-Host "ホワイトリストポリシーが作成されました: $($Response.id)" -ForegroundColor Green
   } catch {
       Write-Host "ポリシー作成に失敗しました。" -ForegroundColor Red
   }
  1. 適用と確認
    ホワイトリストに登録されたドメインに問題なくアクセスできることを確認してください。

シナリオ3: レポートを活用したセキュリティ評価

DNSフィルタリングポリシーの有効性を測定するために、トラフィックログを取得して分析します。

  1. レポート取得スクリプト例
    以下のスクリプトでUmbrellaのトラフィックレポートを取得します。
   $ReportUrl = "https://management.api.umbrella.com/v1/reports/top-dns-queries"
   try {
       $ReportResponse = Invoke-RestMethod -Uri $ReportUrl -Headers $Headers -Method Get
       Write-Host "トップDNSクエリ:" -ForegroundColor Green
       $ReportResponse.data | ForEach-Object {
           Write-Host "Domain: $_.domain, Hits: $_.hits"
       }
   } catch {
       Write-Host "レポート取得に失敗しました。" -ForegroundColor Red
   }
  1. 分析結果の活用
  • 多くのヒット数を持つ疑わしいドメインを特定して新しいブロックポリシーを作成する。
  • 許可が必要なドメインをホワイトリストに追加する。

注意点

  • これらのシナリオを実行する前に、必ずテスト環境で設定を検証してください。
  • Cisco UmbrellaのAPIレート制限を超えないよう、リクエスト間に間隔を設ける必要がある場合があります。
  • ポリシー変更後は、ダッシュボードを使用して効果を監視し、必要に応じて微調整を行ってください。

これらの実践例を基に、DNSレイヤーでのセキュリティを強化する設定を効果的に進めることが可能です。

トラブルシューティングとベストプラクティス

Cisco Umbrellaの管理中に問題が発生した場合、適切なトラブルシューティングとベストプラクティスを知っておくことで、スムーズな運用が可能になります。このセクションでは、一般的なトラブルとその解決策、また効果的な管理のためのヒントを紹介します。

よくある問題と解決策

1. APIキーが機能しない


原因: APIキーが無効化されている、または間違っている場合。
対策:

  • APIキーを再生成して設定し直します。
  [System.Environment]::SetEnvironmentVariable("UmbrellaAPIKey", "your-new-api-key", "User")
  • 正しいAPIキーが使用されていることをスクリプトで確認します。

2. リクエストエラー(403 Forbidden)


原因: 認証が正しく行われていない、またはアクセス権限が不足している。
対策:

  • APIキーが適切な権限を持つことを確認してください。
  • リクエストヘッダーにAPIキーを正しく設定しているか確認します。

3. リクエストエラー(429 Too Many Requests)


原因: APIリクエストのレート制限を超過した場合。
対策:

  • スクリプトにリクエスト間の待機時間を追加します。
  Start-Sleep -Seconds 1
  • リクエスト回数を最小限に抑えるよう、必要な処理のみ実行する。

4. スクリプトの構文エラー


原因: JSON形式の構造が間違っている、または入力データに誤りがある。
対策:

  • JSON形式のデータを作成する際、ConvertTo-Json -Depth 10を使用して正しい形式であることを確認します。
  • スクリプトの構文をテスト環境で検証します。

ベストプラクティス

1. 設定の変更は必ずテスト環境で検証する

  • 本番環境での実行前に、すべてのスクリプトとポリシー変更をテスト環境で実施します。
  • テスト環境がない場合は、影響範囲を限定した設定変更から始めます。

2. APIリクエストのログを保持する

  • トラブル時の解析に役立つよう、スクリプトでAPIリクエストのレスポンスをログファイルに保存します。
  $Response | Out-File -FilePath "api_log.txt" -Append

3. ポリシー変更の履歴を記録する

  • すべてのポリシー変更内容を記録し、いつ誰が変更を行ったかを追跡できるようにします。
  • バージョン管理ツール(例: Git)を使用してスクリプトを管理すると便利です。

4. スクリプトをモジュール化する

  • よく使う機能をモジュール化して再利用可能にすることで、スクリプト管理が容易になります。
  • 例: ポリシー作成用の関数を作成して他のスクリプトから呼び出す。

5. APIの最新情報を確認する

  • Cisco Umbrellaの公式ドキュメントを定期的に確認し、新しいAPI機能や仕様変更に対応します。

トラブル発生時のサポート活用

  • Cisco Umbrella公式ドキュメントを参照してください。
  • サポートチームに連絡する際は、エラーメッセージやリクエスト内容を詳細に伝えると迅速な対応が得られます。

これらのトラブルシューティングとベストプラクティスを活用することで、Cisco Umbrellaの管理がさらに効率的で安定したものになります。

まとめ

本記事では、PowerShellとCisco Umbrellaを活用したDNSセキュリティ強化とポリシー管理の手法を解説しました。Cisco Umbrella APIを使った効率的なポリシー操作や一括管理、DNSレイヤーセキュリティの実践例を通じて、セキュリティ管理の重要性と効果を確認しました。

PowerShellを用いることで、手作業では困難な一貫性と効率性を確保できる点が最大のメリットです。また、トラブルシューティングやベストプラクティスを取り入れることで、管理作業をさらに円滑に進めることが可能です。これらを実践することで、強固で効率的なネットワークセキュリティを構築しましょう。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次