소개
이 문서에서는 Cisco ISE(Identity Services Engine)와의 그룹 정책 매핑을 위한 원격 액세스 VPN 구성에 대해 설명합니다.
사전 요구 사항
요구 사항
다음 주제에 대한 지식을 보유하고 있으면 유용합니다.
- Cisco Secure Client(AnyConnect)
- Cisco ISE
- Cisco ASA(Adaptive Security Appliance)의 원격 액세스 VPN
사용되는 구성 요소
이 문서의 내용은 이러한 소프트웨어 및 하드웨어 버전을 기반으로 합니다.
- 소프트웨어 버전 9.8.1의 ASA 5506
- AnyConnect 버전 4.8
- ISE 버전 2.4.
이 문서의 정보는 특정 랩 환경의 디바이스를 토대로 작성되었습니다. 이 문서에 사용된 모든 디바이스는 초기화된(기본) 컨피그레이션으로 시작되었습니다. 현재 네트워크가 작동 중인 경우 모든 명령의 잠재적인 영향을 미리 숙지하시기 바랍니다.
구성
이 컨피그레이션 예에서는 Cisco Secure Client(AnyConnect)를 사용하여 VPN을 통해 ASA에 연결하는 원격 사용자가 드롭다운 메뉴에서 연결 프로파일(터널 그룹)을 선택할 수 없습니다. Cisco ISE가 구성된 정책을 기반으로 특정 그룹 정책에 매핑하기 때문입니다.
이 설정에서는 ISE를 통해 각 AnyConnect 사용자에게 그룹 정책을 할당할 수 있습니다. 사용자는 터널 그룹을 선택할 수 있는 옵션이 없으므로 처음에는 DefaultWEBVPNGroup 터널 그룹 및 DfltGrpPolicy 그룹 정책에 연결됩니다. 인증 후 RADIUS 클래스 특성(그룹 정책)이 인증 응답 내에서 ISE에 의해 전송되는 경우 사용자는 해당 그룹 정책에 할당되므로 적절한 권한을 받습니다. ISE가 Class 특성을 반환하지 않거나 ASA에 구성되지 않은 그룹 정책 레이블을 반환하면 사용자는 DfltGrpPolicy에 할당된 상태로 유지됩니다. 할당된 그룹 정책이 없는 사용자가 VPN을 통해 연결하는 것을 방지하려면 DfltGrpPolicy group-policy 아래에서 vpn-simultaneous-logins 0 명령을 구성할 수 있습니다.
설정
ASA
AAA-서버
aaa-server ISE_AAA protocol radius
aaa-server ISE_AAA (Outside) host 10.31.124.82
key cisco123
원격 액세스 VPN 구성
webvpn
enable outside
anyconnect image disk0:/anyconnect-win-4.7.01076-webdeploy-k9.pkg 1
anyconnect enable
tunnel-group DefaultWEBVPNGroup general-attributes
address-pool Remote_users
authentication-server-group ISE_AAA
group-policy DfltGrpPolicy attributes
banner value ###YOU DON'T HAVE AUTHORIZATION TO ACCESS ANY INTERNAL RESOURCES###
vpn-simultaneous-logins 0
vpn-tunnel-protocol ssl-client
group-policy RADIUS-USERS internal
group-policy RADIUS-USERS attributes
banner value YOU ARE CONNECTED TO ### RADIUS USER AUTHENTICATION###
vpn-simultaneous-logins 3
vpn-tunnel-protocol ssl-client
split-tunnel-network-list value SPLIT_ACL
group-policy RADIUS-ADMIN internal
group-policy RADIUS-ADMIN attributes
banner value YOU ARE CONNECTED TO ###RADIUS ADMIN AUTHENTICATION ###
vpn-simultaneous-logins 3
vpn-tunnel-protocol ssl-client
split-tunnel-network-list none
ISE
1단계. ASA를 ISE의 유효한 네트워크 디바이스로 등록하고 RADIUS를 위한 공유 비밀 키를 구성합니다. 이를 위해 Administration(관리)>Network Resources(네트워크 리소스)>Network Devices(네트워크 디바이스)로 이동합니다.
2단계. ID 그룹을 생성합니다.
비슷한 특성을 가진 사용자와 비슷한 권한을 공유하는 사용자를 연결하도록 ID 그룹을 정의합니다. 다음 단계에서 사용됩니다. Administration(관리) >Groups(그룹)>User Identity Groups(사용자 ID 그룹)로 이동합니다.
3단계. 사용자를 ID 그룹에 연결합니다.
사용자를 올바른 ID 그룹에 연결합니다. Administration(관리) >Identities(ID)>Users(사용자)로 이동합니다.
4단계. 정책 집합을 생성합니다.
새 정책 집합을 정의하고 정책과 일치하는 조건을 정의합니다. 이 예에서는 모든 디바이스 유형이 조건에서 허용됩니다. 이를 위해 Policy(정책) >Policy sets(정책 집합)로 이동합니다.
5단계. 권한 부여 정책을 생성합니다.
정책과 일치하는 필수 조건으로 새 권한 부여 정책을 정의합니다. 2단계에서 생성한 ID 그룹을 조건으로 포함해야 합니다.
6단계. 권한 부여 프로파일을 생성합니다.
권한 부여 프로파일에는 권한 부여 정책이 일치할 때 수행되는 작업이 포함됩니다. 다음 특성을 포함하는 새 권한 부여 프로파일을 만듭니다.
- RADIUS 클래스 = <Group-policy-ASA>
- 액세스 유형: ACCESS_ACCEPT.
참고: ASA 컨피그레이션에서 정의한 그룹 정책의 이름과 일치하도록 이전 이미지에 표시된 컨피그레이션을 편집해야 합니다.
7단계. 권한 부여 프로파일 컨피그레이션을 검토합니다.
참고: 동일한 정책 집합에서 각 ID 그룹을 ASA에 정의된 특정 그룹 정책에 매핑하기 위해 n개의 권한 부여 정책을 가질 수 있습니다.
이 컨피그레이션 예에서는 사용자가 속한 ID 그룹을 기반으로 ISE 컨피그레이션을 통해 각 보안 클라이언트 사용자에게 그룹 정책을 동적으로 할당할 수 있습니다.
다음을 확인합니다.
가장 유용한 디버그 중 하나는 디버그 radius입니다. AAA 서버(ISE)와 ASA 간의 RADIUS 인증 요청 및 인증 응답에 대한 세부사항을 표시합니다.
debug radius
또 다른 유용한 툴은 명령 테스트 aaa-server입니다. 이제 인증이 ACCEPTED 또는 REJECTED인지 그리고 인증 프로세스에서 교환된 특성(이 예에서는 'class' 특성)이 표시됩니다.
test aaa-server authentication <aaa_server_group> [host <name>|<host_ip>] username <user> password <password>
작업 시나리오
앞에서 언급한 컨피그레이션 예에서, user1은 ISE 컨피그레이션에 따라 RADIUS-ADMIN 그룹 정책에 속합니다. 테스트 aaa-server를 실행하고 ASA에서 radius 디버그를 활성화하면 확인할 수 있습니다. 디버그의 관련 줄은 굵게 표시됩니다.
ASAv# debug radius
ASAv#test aaa-server authentication ISE_AAA host 10.31.124.82 username user1 password *****
INFO: Attempting Authentication test to IP address (10.31.124.82) (timeout: 12 seconds)
RADIUS packet decode (authentication request)
--------------------------------------
Raw packet data (length = 84).....
01 1e 00 54 ac b6 7c e5 58 22 35 5e 8e 7c 48 73 | ...T..|.X"5^.|Hs
04 9f 8c 74 01 07 75 73 65 72 31 02 12 ad 19 1c | ...t..user1.....
40 da 43 e2 ba 95 46 a7 35 85 52 bb 6f 04 06 0a | @.C...F.5.R.o...
1f 7c 55 05 06 00 00 00 06 3d 06 00 00 00 05 1a | .|U......=......
15 00 00 00 09 01 0f 63 6f 61 2d 70 75 73 68 3d | .......coa-push=
74 72 75 65 | true
Parsed packet data.....
Radius: Code = 1 (0x01)
Radius: Identifier = 30 (0x1E)
Radius: Length = 84 (0x0054)
Radius: Vector: ACB67CE55822355E8E7C4873049F8C74
Radius: Type = 1 (0x01) User-Name
Radius: Length = 7 (0x07)
Radius: Value (String) =
75 73 65 72 31 | user1
Radius: Type = 2 (0x02) User-Password
Radius: Length = 18 (0x12)
Radius: Value (String) =
ad 19 1c 40 da 43 e2 ba 95 46 a7 35 85 52 bb 6f | ...@.C...F.5.R.o
Radius: Type = 4 (0x04) NAS-IP-Address
Radius: Length = 6 (0x06)
Radius: Value (IP Address) = 10.31.124.85 (0x0A1F7C55)
Radius: Type = 5 (0x05) NAS-Port
Radius: Length = 6 (0x06)
Radius: Value (Hex) = 0x6
Radius: Type = 61 (0x3D) NAS-Port-Type
Radius: Length = 6 (0x06)
Radius: Value (Hex) = 0x5
Radius: Type = 26 (0x1A) Vendor-Specific
Radius: Length = 21 (0x15)
Radius: Vendor ID = 9 (0x00000009)
Radius: Type = 1 (0x01) Cisco-AV-pair
Radius: Length = 15 (0x0F)
Radius: Value (String) =
63 6f 61 2d 70 75 73 68 3d 74 72 75 65 | coa-push=true
send pkt 10.31.124.82/1645
rip 0x00007f03b419fb08 state 7 id 30
rad_vrfy() : response message verified
rip 0x00007f03b419fb08
: chall_state ''
: state 0x7
: reqauth:
ac b6 7c e5 58 22 35 5e 8e 7c 48 73 04 9f 8c 74
: info 0x00007f03b419fc48
session_id 0x80000007
request_id 0x1e
user 'user1'
response '***'
app 0
reason 0
skey 'cisco123'
sip 10.31.124.82
type 1
RADIUS packet decode (response)
--------------------------------------
Raw packet data (length = 188).....
02 1e 00 bc 9e 5f 7c db ad 63 87 d8 c1 bb 03 41 | ....._|..c.....A
37 3d 7a 35 01 07 75 73 65 72 31 18 43 52 65 61 | 7=z5..user1.CRea
75 74 68 53 65 73 73 69 6f 6e 3a 30 61 31 66 37 | uthSession:0a1f7
63 35 32 52 71 51 47 52 72 70 36 5a 35 66 4e 4a | c52RqQGRrp6Z5fNJ
65 4a 39 76 4c 54 6a 73 58 75 65 59 35 4a 70 75 | eJ9vLTjsXueY5Jpu
70 44 45 61 35 36 34 66 52 4f 44 57 78 34 19 0e | pDEa564fRODWx4..
52 41 44 49 55 53 2d 41 44 4d 49 4e 19 50 43 41 | RADIUS-ADMIN.PCA
43 53 3a 30 61 31 66 37 63 35 32 52 71 51 47 52 | CS:0a1f7c52RqQGR
72 70 36 5a 35 66 4e 4a 65 4a 39 76 4c 54 6a 73 | rp6Z5fNJeJ9vLTjs
58 75 65 59 35 4a 70 75 70 44 45 61 35 36 34 66 | XueY5JpupDEa564f
52 4f 44 57 78 34 3a 69 73 65 61 6d 79 32 34 2f | RODWx4:iseamy24/
33 37 39 35 35 36 37 34 35 2f 33 31 | 379556745/31
Parsed packet data.....
Radius: Code = 2 (0x02)
Radius: Identifier = 30 (0x1E)
Radius: Length = 188 (0x00BC)
Radius: Vector: 9E5F7CDBAD6387D8C1BB0341373D7A35
Radius: Type = 1 (0x01) User-Name
Radius: Length = 7 (0x07)
Radius: Value (String) =
75 73 65 72 31 | user1
Radius: Type = 24 (0x18) State
Radius: Length = 67 (0x43)
Radius: Value (String) =
52 65 61 75 74 68 53 65 73 73 69 6f 6e 3a 30 61 | ReauthSession:0a
31 66 37 63 35 32 52 71 51 47 52 72 70 36 5a 35 | 1f7c52RqQGRrp6Z5
66 4e 4a 65 4a 39 76 4c 54 6a 73 58 75 65 59 35 | fNJeJ9vLTjsXueY5
4a 70 75 70 44 45 61 35 36 34 66 52 4f 44 57 78 | JpupDEa564fRODWx
34 | 4
Radius: Type = 25 (0x19) Class
Radius: Length = 14 (0x0E)
Radius: Value (String) =
52 41 44 49 55 53 2d 41 44 4d 49 4e | RADIUS-ADMIN
Radius: Type = 25 (0x19) Class
Radius: Length = 80 (0x50)
Radius: Value (String) =
43 41 43 53 3a 30 61 31 66 37 63 35 32 52 71 51 | CACS:0a1f7c52RqQ
47 52 72 70 36 5a 35 66 4e 4a 65 4a 39 76 4c 54 | GRrp6Z5fNJeJ9vLT
6a 73 58 75 65 59 35 4a 70 75 70 44 45 61 35 36 | jsXueY5JpupDEa56
34 66 52 4f 44 57 78 34 3a 69 73 65 61 6d 79 32 | 4fRODWx4:iseamy2
34 2f 33 37 39 35 35 36 37 34 35 2f 33 31 | 4/379556745/31
rad_procpkt: ACCEPT
RADIUS_ACCESS_ACCEPT: normal termination
RADIUS_DELETE
remove_req 0x00007f03b419fb08 session 0x80000007 id 30
free_rip 0x00007f03b419fb08
radius: send queue empty
INFO: Authentication Successful
Secure Client를 통해 연결된 경우 ISE에서 user1에게 올바른 그룹 정책이 할당되었는지 확인하는 또 다른 방법은 show vpn-sessiondb anyconnect 명령을 사용하는 것입니다.
ASAv# show vpn-sessiondb anyconnect
Session Type: AnyConnect
Username : user1 Index : 28
Assigned IP : 10.100.2.1 Public IP : 10.100.1.3
Protocol : AnyConnect-Parent SSL-Tunnel DTLS-Tunnel
License : AnyConnect Premium
Encryption : AnyConnect-Parent: (1)none SSL-Tunnel: (1)AES-GCM-256 DTLS-Tunnel: (1)AES256
Hashing : AnyConnect-Parent: (1)none SSL-Tunnel: (1)SHA384 DTLS-Tunnel: (1)SHA1
Bytes Tx : 15604 Bytes Rx : 28706
Group Policy : RADIUS-ADMIN Tunnel Group : DefaultWEBVPNGroup
Login Time : 04:14:45 UTC Wed Jun 3 2020
Duration : 0h:01m:29s
Inactivity : 0h:00m:00s
VLAN Mapping : N/A VLAN : none
Audt Sess ID : 0a6401010001c0005ed723b5
Security Grp : none
문제 해결
또한 문제가 발생할 때 debug radius 및 test aaa-server 명령을 사용하여 문제를 해결할 수 있습니다. 가장 일반적인 문제는 다음에 설명되어 있습니다.
비작업 시나리오 1
Anyconnect에서 인증이 실패하고 ISE가 REJECT로 응답하는 경우 사용자가 사용자 ID 그룹과 연결되었거나 비밀번호가 잘못되었는지 확인해야 합니다. Operations(운영) >Live logs(라이브 로그) > Details(세부사항)로 이동합니다.
RADIUS packet decode (response)
--------------------------------------
Raw packet data (length = 20).....
03 21 00 14 dd 74 bb 43 8f 0a 40 fe d8 92 de 7a | .!...t.C..@....z
27 66 15 be | 'f..
Parsed packet data.....
Radius: Code = 3 (0x03)
Radius: Identifier = 33 (0x21)
Radius: Length = 20 (0x0014)
Radius: Vector: DD74BB438F0A40FED892DE7A276615BE
rad_procpkt: REJECT
RADIUS_DELETE
remove_req 0x00007f03b419fb08 session 0x80000009 id 33
free_rip 0x00007f03b419fb08
radius: send queue empty
ERROR: Authentication Rejected: AAA failure
참고: 이 예에서 user1은 어떤 사용자 ID 그룹과도 연결되지 않습니다. 따라서 DenyAccess 작업이 있는 New Policy Set 1(새 정책 집합 1) 아래의 Default Authentication and Authorization(기본 인증 및 권한 부여) 정책을 확인합니다. 사용자 ID 그룹이 연결되지 않은 사용자가 인증할 수 있도록 기본 권한 부여 정책에서 PermitAccess로 이 작업을 수정할 수 있습니다.
비작업 시나리오 2
Anyconnect에서 인증이 실패하고 기본 권한 부여 정책이 PermitAccess인 경우 인증이 수락됩니다. 그러나 Radius 응답에는 클래스 특성이 표시되지 않으므로 사용자는 DfltGrpPolicy에 있으며 구성된 명령 vpn-simultaneous-logins 0으로 인해 연결되지 않습니다.
RADIUS packet decode (response)
--------------------------------------
Raw packet data (length = 174).....
02 24 00 ae 5f 0f bc b1 65 53 64 71 1a a3 bd 88 | .$.._...eSdq....
7c fe 44 eb 01 07 75 73 65 72 31 18 43 52 65 61 | |.D...user1.CRea
75 74 68 53 65 73 73 69 6f 6e 3a 30 61 31 66 37 | uthSession:0a1f7
63 35 32 32 39 54 68 33 47 68 6d 44 54 49 35 71 | c5229Th3GhmDTI5q
37 48 46 45 30 7a 6f 74 65 34 6a 37 50 76 69 4b | 7HFE0zote4j7PviK
5a 35 77 71 6b 78 6c 50 39 33 42 6c 4a 6f 19 50 | Z5wqkxlP93BlJo.P
43 41 43 53 3a 30 61 31 66 37 63 35 32 32 39 54 | CACS:0a1f7c5229T
68 33 47 68 6d 44 54 49 35 71 37 48 46 45 30 7a | h3GhmDTI5q7HFE0z
6f 74 65 34 6a 37 50 76 69 4b 5a 35 77 71 6b 78 | ote4j7PviKZ5wqkx
6c 50 39 33 42 6c 4a 6f 3a 69 73 65 61 6d 79 32 | lP93BlJo:iseamy2
34 2f 33 37 39 35 35 36 37 34 35 2f 33 37 | 4/379556745/37
Parsed packet data.....
Radius: Code = 2 (0x02)
Radius: Identifier = 36 (0x24)
Radius: Length = 174 (0x00AE)
Radius: Vector: 5F0FBCB1655364711AA3BD887CFE44EB
Radius: Type = 1 (0x01) User-Name
Radius: Length = 7 (0x07)
Radius: Value (String) =
75 73 65 72 31 | user1
Radius: Type = 24 (0x18) State
Radius: Length = 67 (0x43)
Radius: Value (String) =
52 65 61 75 74 68 53 65 73 73 69 6f 6e 3a 30 61 | ReauthSession:0a
31 66 37 63 35 32 32 39 54 68 33 47 68 6d 44 54 | 1f7c5229Th3GhmDT
49 35 71 37 48 46 45 30 7a 6f 74 65 34 6a 37 50 | I5q7HFE0zote4j7P
76 69 4b 5a 35 77 71 6b 78 6c 50 39 33 42 6c 4a | viKZ5wqkxlP93BlJ
6f | o
Radius: Type = 25 (0x19) Class
Radius: Length = 80 (0x50)
Radius: Value (String) =
43 41 43 53 3a 30 61 31 66 37 63 35 32 32 39 54 | CACS:0a1f7c5229T
68 33 47 68 6d 44 54 49 35 71 37 48 46 45 30 7a | h3GhmDTI5q7HFE0z
6f 74 65 34 6a 37 50 76 69 4b 5a 35 77 71 6b 78 | ote4j7PviKZ5wqkx
6c 50 39 33 42 6c 4a 6f 3a 69 73 65 61 6d 79 32 | lP93BlJo:iseamy2
34 2f 33 37 39 35 35 36 37 34 35 2f 33 37 | 4/379556745/37
rad_procpkt: ACCEPT
RADIUS_ACCESS_ACCEPT: normal termination
RADIUS_DELETE
remove_req 0x00007f03b419fb08 session 0x8000000b id 36
free_rip 0x00007f03b419fb08
radius: send queue empty
INFO: Authentication Successful
ASAv#
vpn-simultaneous-logins 0이 '1'로 변경되면 사용자는 출력에 표시된 대로 연결됩니다.
ASAv# show vpn-sessiondb anyconnect
Session Type: AnyConnect
Username : user1 Index : 41
Assigned IP : 10.100.2.1 Public IP : 10.100.1.3
Protocol : AnyConnect-Parent SSL-Tunnel DTLS-Tunnel
License : AnyConnect Premium
Encryption : AnyConnect-Parent: (1)none SSL-Tunnel: (1)AES-GCM-256 DTLS-Tunnel: (1)AES256
Hashing : AnyConnect-Parent: (1)none SSL-Tunnel: (1)SHA384 DTLS-Tunnel: (1)SHA1
Bytes Tx : 15448 Bytes Rx : 15528
Group Policy : DfltGrpPolicy Tunnel Group : DefaultWEBVPNGroup
Login Time : 18:43:39 UTC Wed Jun 3 2020
Duration : 0h:01m:40s
Inactivity : 0h:00m:00s
VLAN Mapping : N/A VLAN : none
Audt Sess ID : 0a640101000290005ed7ef5b
Security Grp : none
비작업 시나리오 3
인증이 통과되었지만 사용자에게 올바른 정책이 적용되지 않은 경우(예: 연결된 그룹 정책에 전체 터널이 아닌 스플릿 터널이 있어야 하는 경우) 사용자가 잘못된 사용자 ID 그룹에 있을 수 있습니다.
ASAv# sh vpn-sessiondb anyconnect
Session Type: AnyConnect
Username : user1 Index : 29
Assigned IP : 10.100.2.1 Public IP : 10.100.1.3
Protocol : AnyConnect-Parent SSL-Tunnel
License : AnyConnect Premium
Encryption : AnyConnect-Parent: (1)none SSL-Tunnel: (1)AES-GCM-256
Hashing : AnyConnect-Parent: (1)none SSL-Tunnel: (1)SHA384
Bytes Tx : 15592 Bytes Rx : 0
Group Policy : RADIUS-USERS Tunnel Group : DefaultWEBVPNGroup
Login Time : 04:36:50 UTC Wed Jun 3 2020
Duration : 0h:00m:20s
Inactivity : 0h:00m:00s
VLAN Mapping : N/A VLAN : none
Audt Sess ID : 0a6401010001d0005ed728e2
Security Grp : none
비디오
이 비디오에서는 SSL Anyconnect With ISE 인증 및 그룹 정책 매핑을 위한 클래스 특성을 구성하는 단계를 제공합니다.