使用Terraform创建Cisco ISE策略
首先
-
- 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つのポリシーをまとめるコンポーネント
認証ポリシー:アクセスしてきたユーザやデバイスの認証方式を定義
認可ポリシー:アクセスしてきたユーザやデバイスに割り当てる権限を定義
执行
使用Terraform,可以在浏览器上高效地将以下策略部署到Cisco ISE。
ポリシーセットの作成
ルール名:”Wired MAB”
条件:”WiredMAB”
許可されたプロトコルサービス:”Default Network Service”
認証ポリシーの作成
ルール名:MAB
条件:”WiredMAB”
アイデンティティ参照場所:”Internal Endpoints”
認証失敗時の処理
接続に失敗した場合:”REJECT”
ユーザが見つからない場合:”REJECT”
プロセスが失敗した場合:”DROP”
認可ポリシーの作成
ルール名:MAB Endpoints
条件:”Endpoint Identity Groups:MAB-Endpoints”
結果:”PermitAccess”
自动化的趋势
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:認可ポリシー作成用
创建Workspace
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
自动申请设置
如果计划成功,将设置自动执行应用。
在工作区应用完成后,还会启用自动触发器来执行下一个工作区的设置。
设定执行触发器
将policyset_create的应用作为触发器,自动执行authn_create(创建认证策略)和authz_create(创建授权策略)的设置。
远程状态共享的设置
进行将terraform_remote_state与其他工作区共享的设置。
代理人的设置
由于本次设定更改的Cisco ISE存在于私有网络中,因此需要安装Agent。
省略Agent的安装方法。
代理人移动到已安装代理的目录,并设置令牌和代理名称,然后启动代理。※请参考生成令牌时的命令说明。
$ 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
4. 验证动作
由于准备工作已经完成,现在可以实际执行一下了。
4.1 通过 Terraform Cloud 进行部署
从设置执行触发器中,当 policyset_create 执行成功时,authn_create / authz_create 会自动执行,因此只需要手动运行 policyset_create。
4.2 执行结果(创建策略集)
4.3 执行结果(authn_create/authz_create)
最后
这次我尝试使用Terraform来配置ISE,但是发现编写代码的方式很特别,有些资源可能因为Terraform版本不同而无法运行,所以遇到了一些困难。
另外,我觉得不仅仅是安全策略,如果能够根据频繁配置的项目和常见的使用情况创建模板,可能会更加高效。
我将继续探索Terraform的可能性。
免责事项
在本网站和相关评论中表达的意见是投稿者本人的个人意见,不代表思科公司的观点。本网站的内容仅供信息提供目的,不旨在推荐或代表思科或其他相关方的意见。每个用户通过在本网站上发布、链接或以其他方式上传的所有信息内容负有全部责任,并同意免除思科公司对于使用本网站所产生的任何责任。