5.1 証明書アクセス制御リスト

通信セキュリティを強化する方法を学習します。

通信セキュリティは、接続ハンドシェイク・プロセス中に有効な証明書を受け入れます。証明書は、サーバーによって署名されている必要があります。また、CAの場合はサーバーから信頼されている必要があります。ただし、内部ポリシーに基づいて有効な証明書をフィルタ処理して拒否することが必要な場合があります。この追加の検証をサポートするために、MAは検証後の証明書のアクセス制御リスト(ACL)管理を追加することにより、標準的な証明書検証を拡張します。この証明書ACLは、ネットワークACLに使用される一般的なモデルに従います。ここで、ACLは、管理対象要素を識別するキーと、その要素が許可または拒否されているかどうかを示す値のマップです。certACLエントリは、ACLエントリを証明書内の特定の識別要素に適用できるscope仕様を持っています。

証明書ACLの構成は、certACLエントリ構成仕様の配列形式を使用します。それぞれの仕様は、最小限、その仕様が指定アドレスからのクライアント接続を許可するか拒否するかを示す許可文を含んでいます。certACLエントリ仕様は順番に処理され、指定アドレスが適格と認定され次第終了します。指定アドレスが適格と認定されない場合、処理は次の仕様を続けます。証明書が適格と認定されると、certACL権限は証明書が許可されるか拒否されるかを決定します。certACLエントリ仕様が、接続を要求しているクライアントの証明書を適格と認定しない場合、デフォルトの解決方法の「許可」が仮定され、証明書が受け入れられます。

CertACLエントリの構文

certACL := '[' aclSpec [, aclSpec] ']'
  aclSpec    := '{' perm [',' name [',' scope '}'
  perm       := "permission" ':' [ "deny" | "allow" ]
  name       := "name"       ':' regex 
  scope      := "scope"      ':' [ "subject-name" | "issuer-name" ]
  regex      :=  ** Uses the dynamic regular expression syntax. 

regex構文はECMAScriptの定義に従います。正規表現をJSONノード値として定義するには、(\sのように)使用されるすべてのメタ・シンボルが\文字をエスケープする必要があります。名前の正規表現パターンを指定するときは、意図したターゲット・パターンとの完全一致のみが一致するように注意する必要があります。構文では、マッチ・パターンにパターンをバインドするデリミタの指定が含まれているため、 CN=AdminClnt1CN=AdminClntOtherCN=OtherAdminClntまたはCCN=OtherAdminClntではなく目的のパターンCN=AdminClntと完全に一致します。これらのパターンでは、キー名と値の間の空白が許可されていない標準識別名形式を想定しています。CN = AdminClntの非標準パターンは一致しません。

例5-1 すべての証明書を許可する例

 "CertACL" : [ { "name" : "^(?:(?:\\s*,?)|.*[\\s,]+)(CN=AdminClnt)(?:(?:\\s*(,+\\s*.*))$|\\s$)", "permission" : "deny" } ]

または

"CertACL" : [ { "name" : "^(?:(?:\\s*,?)|.*[\\s,]+)(CN=AdminClnt)(?:(?:\\s*(,+\\s*.*))$|\\s$)", "scope" : "subject-name", "permission" : "deny" } ]

例5-2 Deploy2から発行された証明書の拒否

 "CertACL" : [ { "name" : "^(?:(?:\\s*,?)|.*[\\s,]+)(CN=Deploy2)(?:(?:\\s*(,+\\s*.*))$|\\s$)", "scope" : "issuer-name", "permission" : "deny" } ]
 

例5-3 Suspectに発行された証明書またはDeploy2により発行された任意の証明書

 "CertACL" : [ { "name" : "^(?:(?:\\s*,?)|.*[\\s,]+)(CN=Suspect)(?:(?:\\s*(,+\\s*.*))$|\\s$)", "scope" : "subject-name", "permission" : "deny" }, { "name" : "^(?:(?:\\s*,?)|.*[\\s,]+)(CN=Deploy2)(?:(?:\\s*(,+\\s*.*))$|\\s$)", "scope" : "issuer-name",  "permission" : "deny" } ]