使用Terraform创建Cisco ISE策略

首先

本文是Cisco Systems Japan Advent Calendar 2023第七天的文章。
    • 2017年版: https://qiita.com/advent-calendar/2017/cisco

2018年版: https://qiita.com/advent-calendar/2018/cisco

2019年版: https://qiita.com/advent-calendar/2019/cisco

2020年版: https://qiita.com/advent-calendar/2020/cisco

2020年版(2枚目): https://qiita.com/advent-calendar/2020/cisco2

2021年版: https://qiita.com/advent-calendar/2021/cisco

2021年版(2枚目): https://qiita.com/advent-calendar/2021/cisco2

2022年版(1,2): https://qiita.com/advent-calendar/2022/cisco

2023年版: https://qiita.com/advent-calendar/2023/cisco <=== ここ

Cisco Identity Services Engine(ISE)是什么?

思科身份服务引擎(ISE)是思科系统提供的一种安全软件,用于在网络上管理和控制设备和用户,并执行安全策略。

思科ISE安全策略的机制是什么?

安全策略由以下要素组成。

    • ポリシーセット:以下の2つのポリシーをまとめるコンポーネント

認証ポリシー:アクセスしてきたユーザやデバイスの認証方式を定義
認可ポリシー:アクセスしてきたユーザやデバイスに割り当てる権限を定義

image.png

执行

使用Terraform,可以在浏览器上高效地将以下策略部署到Cisco ISE。

ポリシーセットの作成

ルール名:”Wired MAB”
条件:”WiredMAB”
許可されたプロトコルサービス:”Default Network Service”

image.png

認証ポリシーの作成

ルール名:MAB
条件:”WiredMAB”
アイデンティティ参照場所:”Internal Endpoints”
認証失敗時の処理

接続に失敗した場合:”REJECT”
ユーザが見つからない場合:”REJECT”
プロセスが失敗した場合:”DROP”

image.png

認可ポリシーの作成

ルール名:MAB Endpoints
条件:”Endpoint Identity Groups:MAB-Endpoints”
結果:”PermitAccess”

image.png

自动化的趋势

1205.jpg

1.将代码从本地仓库推送到远程仓库
2.在Terraform Cloud上创建工作空间,并关联GitHub和仓库
3.手动触发执行,并将任务分配给Agent
4.执行任务,进行Cisco ISE的配置更改

环境。

    • GitHub

 

    • Terraform v1.6.5

 

    • providers.ciscoise Version0.6.22-beta

 

    • WSL2(Ubuntu-22.04)

 

    tfc-agent_1.14.1

建立程序

1. Terraform代码
2. 将代码推送到GitHub
3. Terraform Cloud配置
4. 进行操作验证

1.土壤整理代码。

请参考由Hashicorp社提供的Cisco Identity Services Engine(ISE)的官方文档。

 

以下是Terraform执行的各个文件的架构和角色。

Policyset:ポリシーセットの作成

Authentication:認証ポリシーの作成

Authorization:認可ポリシーの作成

.
├── work
│   ├── Policyset
│   │   ├── main.tf
│   │   ├── providers.tf
│   │   ├── variables.tf
│   │   └── outputs.tf
│   │     
│   ├── Authentication
│   │   ├── main.tf
│   │   ├── providers.tf
│   │   └── variables.tf
│   │
│   ├── Authorization
│   │   ├── main.tf
│   │   ├── providers.tf
│   │   └── variables.tf  

1-1. 政策集(创建政策集)

    • main.tf:リソースの定義、メインコード

 

    • providers.tf:サービスプロバイダーの定義

 

    • variables.tf:変数の定義

 

    output.tf:実行後に出力する内容の定義

主.tf

## Cisco ISEのポリシーセットを管理するリソースを定義
resource "ciscoise_network_access_policy_set" "example" {
  provider = ciscoise
  parameters {
   # ルール名
    name         = "Wired MAB"
    # 備考
    description  = "test policy set"
    # デフォルトポリシーかどうか
    default      = "false"
  # ポリシーが適用された回数
    hit_counts   = 0
  # ポリシーの優先度
    rank         = 0
    # ポリシーセットが適用されるプロトコルサービス名
    service_name = "Default Network Access"
    # ポリシーセットの状態
    state        = "enabled"

    condition {
     # 条件タイプの指定
      condition_type = "ConditionAttributes"
      # 条件の属性名
      attribute_name  = "RadiusFlowType"
      # 条件の属性値
      attribute_value = "WiredMAB"
      # 条件の辞書名
      dictionary_name = "Normalised Radius"
      # 比較演算子
      operator        = "equals"
    }
  }
}

资源 “ciscoise_network_access_policy_set” “example” {}:
定义管理Cisco ISE的策略集资源
参数{}:定义策略集的名称、优先级等本身的定义
条件{}:指定应用策略集的条件

・积分
本次我们选择了ConditionAttributes作为condition_type来创建基于属性值的条件,但还有其他选项如下:
ConditionReference:引用现有条件
ConditionAndBlock/OrBlock:组合多个条件以创建逻辑上的AND或OR条件

提供者.tf

terraform {
  required_providers {
    ciscoise = {
      source = "CiscoISE/ciscoise"
      version = "0.6.22-beta"
    }
  }
}
provider "ciscoise" {
  ## 認証情報を外部から取得するための変数を定義
  username = var.ciscoise_username
  password = var.ciscoise_password
  base_url = var.ciscoise_base_url
  ## SSL証明書の検証
  ssl_verify = "false"
  ## リクエストのタイムアウト値
  single_request_timeout = 150
}

terraform{}:用于指定提供程序和版本。
provider{}:用于配置提供程序的具体设置,如认证信息和URL。

variables.tf (变量.tf)

variable "ciscoise_username" {
 ## 変数のデータ型を文字列型に指定
  type        = string
  description = "Username"
  ## デフォルト値の定義
  default     = "*****"
}

variable "ciscoise_password" {
 ## 変数のデータ型を文字列型に指定
  type        = string
  description = "Password"
  ## デフォルト値の定義
  default     = "*****"
}

variable "ciscoise_base_url" {
 ## 変数のデータ型を文字列型に指定
  type        = string
  ## デフォルト値の定義 
  default     = "https://*****"
}

变量 “ciscoise_username” {}:定义一个变量。

output.tf文件

output "policy_set_id" {
  ## ポリシーセットIDの取得
  value = ciscoise_network_access_policy_set.example.id
}

output "policy_set_id_value" {
  ## ポリシーセットIDの一部を取得
  value = substr(ciscoise_network_access_policy_set.example.id, 4, 36)
}

通过输出“policy_set_id” {}:来显示从执行结果中获取的信息。或者,使其可在另一个目录中使用。

    ポイント

取得的值存储在ciscoise_network_access_policy_set.example.id中,需符合以下格式。

policy_set_id = "id:=e20eeef6-****-****-****-************\\name:=test-policyset

由于需要引用1-2, 1-3中的策略集ID,因此使用substr() 函数仅输出UUID。
值 = substr(ciscoise_network_access_policy_set.example.id, 4, 36)

policy_set_id_value = "e20eeef6****-****-****-************"

1-2. 创建认证策略 (Authentication Policy Creation)

    • main.tf

 

    • providers.tf(1.1と同一ファイルのため説明省略)

 

    variables.tf(1.1と同一ファイルのため説明省略)

主要.tf


## リモートステートのデータを取得する
data "terraform_remote_state" "status" {
  ## リモートバックエンドを指定
  backend = "remote"

  config = {
    ## Terraform Cloudの組織名を指定
    organization = "Terraform-Cloud-ISE"
    workspaces = {
    ## Workspace名を指定
    name = "policyset_create"
    }
  }
}
## 認証ポリシーを管理するTerraformリソースを定義
resource "ciscoise_network_access_authentication_rules" "example" {
  provider = ciscoise
  parameters {
    ## アイデンティティ参照場所
    identity_source_name = "Internal Endpoints"
    ## 認証が失敗した場合の動作
    if_auth_fail         = "REJECT"
    ## ユーザが見つからなかった場合の動作
    if_user_not_found    = "REJECT"
    ## プロセスが失敗した場合の動作
    if_process_fail      = "DROP"

  ## リモートステートから取得した`policy_set_id_value`を参照しポリシーIDを指定
    policy_id = data.terraform_remote_state.status.outputs.policy_set_id_value
    rule {

      condition {
    ## 条件タイプの指定 
        condition_type  = "ConditionAttributes"
        ## 条件の属性名
        attribute_name  = "RadiusFlowType"
        ## 条件の属性値
        attribute_value = "WiredMAB"
        ## 条件の辞書名
        dictionary_name = "Normalised Radius"
        ## 比較演算子
        operator        = "equals"
      }
      ## デフォルトポリシーかどうか
      default    = "false"
      ## ポリシーが適用された回数
      hit_counts = 0
      ## ルール名
      name       = "MAB"
      ## ポリシーの優先度
      rank       = 0
      ## ポリシーの状態
      state      = "enabled"
    }
  }
}

资源 “ciscoise_network_access_authentication_rules” “example”{}:
管理Cisco ISE的认证策略资源

数据“terraform_remote_state” “status{}:引用另一个文件夹中的.tfstate文件的输出。

资源 “ciscoise_network_access_authentication_rules” “example”{}:
用于管理 Cisco ISE 的网络访问认证规则

    ポイント

在output.tf文件中,使用data.terraform_remote_state.status.outputs.policy_set_id_value来引用通过policy_id输出的策略ID。

1.3. 授权(创建认可策略)

    • main.tf

 

    • providers.tf(1.1と同一ファイルのため説明省略)

 

    variables.tf(1.1と同一ファイルのため説明省略)

主.tf

data "terraform_remote_state" "status" {
  ## リモートバックエンドを指定
  backend = "remote"

  config = {
    ## Terraform Cloudの組織名を指定
    organization = "Terraform-Cloud-ISE"
    workspaces = {
    ## Workspace名を指定
    name = "policyset_create"
    }
  }
}
## Cisco ISEの認可ポリシー管理するTerraformリソースを定義
resource "ciscoise_network_access_authorization_rules" "example" {
  provider = ciscoise
  parameters {
    ## リモートステートから取得した`policy_set_id_value`を使用してポリシーIDを指定
    policy_id = data.terraform_remote_state.status.outputs.policy_set_id_value
    ## 認可ルールの結果を指定
    profile   = ["PermitAccess"]
    rule {
     ## ルールの条件を指定
      condition {
        ## 条件タイプの指定 
        condition_type  = "ConditionAttributes"
        ## 条件の属性名
        attribute_name  = "Name"
        ## 条件の属性値
        attribute_value = "Endpoint Identity Groups:MAB-Endpoints"
        ## 条件の辞書名
        dictionary_name = "IdentityGroup"
        ## 比較演算子
        operator        = "equals"
      }
    ## デフォルトポリシーかどうか
    default    = "false"
    ## ポリシーが適用された回数
    hit_counts = 0
    ## ルール名
    name       = "MAB Endpoints"
    ## ポリシーの優先度
    rank       = 0
    ## ポリシーの状態
    state      = "enabled"
    }
  }
}

资源“ciscoise_network_access_authorization_rules”“example” {}:
管理Cisco ISE的授权策略的资源。

将代码推送到GitHub。

将使用Terraform编写的代码推送到远程代码库
省略了将代码推送到GitHub的方法

三.Terraform Cloud配置

    • Workspaceを3つ作成

policy_create:ポリシーセット作成用

authn_create:認証ポリシー作成用

authz_create:認可ポリシー作成用

terraform5.jpg

创建Workspace

image.png
image.png
image.png
workspace6.png
image.png

3-2. 工作空间的设置

设置工作目录

设置Terraform执行的目录
由于当前仓库根目录为 ./work,因此需要用相对路径指定每个工作空间的工作目录。

.
├── work
│   ├── Policyset
│   │   ├── main.tf
│   │   ├── providers.tf
│   │   ├── variables.tf
│   │   └── outputs.tf
│   │     
│   ├── Authentication
│   │   ├── main.tf
│   │   ├── providers.tf
│   │   └── variables.tf
│   │
│   ├── Authorization
│   │   ├── main.tf
│   │   ├── providers.tf
│   │   └── variables.tf  
image.png
image.png
image.png

自动申请设置

如果计划成功,将设置自动执行应用。
在工作区应用完成后,还会启用自动触发器来执行下一个工作区的设置。

image.png

设定执行触发器

将policyset_create的应用作为触发器,自动执行authn_create(创建认证策略)和authz_create(创建授权策略)的设置。

image.png

远程状态共享的设置

进行将terraform_remote_state与其他工作区共享的设置。

image.png

代理人的设置

由于本次设定更改的Cisco ISE存在于私有网络中,因此需要安装Agent。
省略Agent的安装方法。

image.png
image.png
image.png
image.png

代理人移动到已安装代理的目录,并设置令牌和代理名称,然后启动代理。※请参考生成令牌时的命令说明。

$ export TFC_AGENT_TOKEN= <token>
$ export TFC_AGENT_NAME=CiscoISE-Agent
$ ./tfc-agent
2023-12-06T17:40:30.410+0900 [INFO]  agent: Starting: agent_name=CiscoISE-Agent agent_version=1.14.1
2023-12-06T17:40:30.500+0900 [INFO]  core: Starting: version=1.14.1
2023-12-06T17:40:31.448+0900 [INFO]  core: Agent registered successfully with Terraform Cloud: agent_id=<agent id> agent_pool_id=<agent pool id>
2023-12-06T17:40:31.573+0900 [INFO]  agent: Core version is up to date: version=1.14.1
2023-12-06T17:40:31.573+0900 [INFO]  core: Waiting for next job
image.png

4. 验证动作

由于准备工作已经完成,现在可以实际执行一下了。

4.1 通过 Terraform Cloud 进行部署

从设置执行触发器中,当 policyset_create 执行成功时,authn_create / authz_create 会自动执行,因此只需要手动运行 policyset_create。

image.png
image.png

4.2 执行结果(创建策略集)

image.png
image.png

4.3 执行结果(authn_create/authz_create)

image.png
image.png
image.png

最后

这次我尝试使用Terraform来配置ISE,但是发现编写代码的方式很特别,有些资源可能因为Terraform版本不同而无法运行,所以遇到了一些困难。
另外,我觉得不仅仅是安全策略,如果能够根据频繁配置的项目和常见的使用情况创建模板,可能会更加高效。
我将继续探索Terraform的可能性。

免责事项

在本网站和相关评论中表达的意见是投稿者本人的个人意见,不代表思科公司的观点。本网站的内容仅供信息提供目的,不旨在推荐或代表思科或其他相关方的意见。每个用户通过在本网站上发布、链接或以其他方式上传的所有信息内容负有全部责任,并同意免除思科公司对于使用本网站所产生的任何责任。

广告
将在 10 秒后关闭
bannerAds