본문 바로가기

Ryu's Tech

bash 스크립트를 활용한 체크포인트/오픈스택 연동

Table of Contents


목표

아래 글에서 이어지는 글로 기본 정책이 막혀 있는 상태에서 스크립트를 통해 정책 오픈

2018/04/03 - [Ryu's Tech] - 체크포인트 방화벽으로 오픈스택 vRouter 를 대체

오픈스택 내 인스턴스 명으로 IP를 얻어서 체크포인트 방화벽에 정책 추가

스크립트 동작 방식 정의

동작 검증을 위해 bash 스크립트 사용하고 아래 형태로 동작하도록 작성

실행시키면 인스턴스의 가장 처음 연결된 포트의 IP를 얻어서 체크포인트에 등록하도록 설정.

./스크립트명.sh [인스턴스명]

스크립트 동작 방식 설명

인스턴스 명 입력시 얻어지는 정보

[root@controller openstack]# openstack server show svr1
+-------------------------------------+----------------------------------------------------------+
| Field | Value |
+-------------------------------------+----------------------------------------------------------+
| OS-DCF:diskConfig | MANUAL |
| OS-EXT-AZ:availability_zone | nova |
| OS-EXT-SRV-ATTR:host | compute2 |
| OS-EXT-SRV-ATTR:hypervisor_hostname | compute2 |
| OS-EXT-SRV-ATTR:instance_name | instance-00000018 |
| OS-EXT-STS:power_state | Running |
| OS-EXT-STS:task_state | None |
| OS-EXT-STS:vm_state | active |
| OS-SRV-USG:launched_at | 2018-04-03T07:23:07.000000 |
| OS-SRV-USG:terminated_at | None |
| accessIPv4 | |
| accessIPv6 | |
| addresses | internal service1=10.0.1.11 |
| config_drive | |
| created | 2018-04-03T07:22:59Z |
| flavor | c2r2d20 (0f92fe81-6e50-4a9a-bf38-f36a46a2e8ec) |
| hostId | 23073ab84fa29843a30c89b4a8dd0ccd71b4f5b346e665041755d557 |
| id | 7fa609ee-54e7-454e-b39a-088b27dbc4a8 |
| image | centos7custom (1579d3e5-04e2-4221-8f15-9feed369d349) |
| key_name | None |
| name | svr1 |
| progress | 0 |
| project_id | f554dea2d291428f97ba775a26694817 |
| properties | |
| status | ACTIVE |
| updated | 2018-04-03T07:23:07Z |
| user_id | 895204ee5bf041fca44cab8421efcf90 |
| volumes_attached | |
+-------------------------------------+----------------------------------------------------------+
[root@controller openstack]#

필요한 정보 확인

인스턴스 명을 통해 IP 주소를 확인

[root@controller openstack]# HOSTNAME="svr1"
[root@controller openstack]# openstack server show $HOSTNAME | grep addresses
| addresses | internal service1=10.0.1.11 |
[root@controller openstack]#

이후 | 를 cut해서 중간의 필요한 값 부분만 추출

[root@controller openstack]# openstack server show $HOSTNAME | grep addresses | cut -f3 -d'|'
internal service1=10.0.1.11
[root@controller openstack]#

이런 형태로 네트워크 주소만 뽑아지도록 작업

[root@controller openstack]# openstack server show $HOSTNAME | grep addresses | cut -f3 -d'|' | rev | cut -f1 -d';'| rev | cut -c 2- | cut -f2 -d=
10.0.1.11
[root@controller openstack]#

중간의 rev 는 만약 여러 인터페이스가 붙어 있을 경우 최초 인터페이스를 확인하기 위해 역순으로 정렬후 잘라내고 다시 역순 배열.

이렇게 하는 이유는 오픈스택에서 포트1, 포트2, 포트3 으로 붙이게 되면 cli 정보에서는 포트3,포트2,포트1 순서로 보이기 때문.

실제 스크립트 작성

인스턴스명으로 IP 획득

동작 형태로 스크립트 정의.

#!/bin/bash
. ~/admin-openrc
HOSTNAME=$1
HOSTNET=$(echo $(openstack server show $HOSTNAME | grep addresses | cut -f3 -d'|' | rev | cut -f1 -d';'| rev | cut -c 2- | cut -f2 -d=))
echo $HOSTNAME $HOSTNET

Checkpoint API 연동부분

인스턴스명과 IP는 얻었으니 등록만 하면 됨.

체크포인트의 API 관련 문서는 웹사이트에 잘 정리되어있음.

API 문서의 세션 로그인 부분을 참조해 로그인 부분 작성

CPMGMT="192.168.0.10"
SID=`curl -k -H "Content-Type: application/json" -H "Accept: bla" -X POST -d '{"user":"admin","password":"qwe123"}' https://$CPMGMT/web_api/login | grep sid | awk '{print $3}' | sed 's/
\"\([^"]*\)\"\,/\1/'`
echo $SID


VM을 그룹에 추가

앞의 글에서 만들었던 정책대로 해당 인스턴스 명과 IP로 호스트를 추가하면서 vm 그룹에 호스트를 추가

API문서의 add-host 부분 참조.

CURLDATA=$(cat << EOF
{
"name" : "$HOSTNAME",
"ip-address" : "$HOSTNET",
"groups" : [ "vm" ]
}
EOF
)
curl -k -H "Content-Type: application/json" -H "Accept: bla" -H "X-chkp-sid: $SID" -X POST -d "$CURLDATA" https://$CPMGMT/web_api/add-host


정책 PUBLISH 및 배포

정책 PUBLISH 관련 문서INSTALL POLICY 문서를 참조.

echo "AUTO_REGISTRATION: Publishing changes"
curl -k -H "Content-Type: application/json" -H "Accept: bla" -H "X-chkp-sid: $SID" -X POST -d '{}' https://$CPMGMT/web_api/publish
sleep 10
curl -k -H "Content-Type: application/json" -H "Accept: bla" -H "X-chkp-sid: $SID" -X POST -d '{
"policy-package":"Standard",
"access":"true",
"threat-prevention":"false",
"targets":["vfw-checkpoint-gw"]
}' https://$CPMGMT/web_api/install-policy


로그아웃

로그아웃 문서 참조

curl -k -H "Content-Type: application/json" -H "Accept: bla" -H "X-chkp-sid: $SID" -X POST -d '{}' https://$CPMGMT/web_api/logout


전체 스크립트 

#!/bin/bash
. ~/admin-openrc
HOSTNAME=$1
HOSTNET=$(echo $(openstack server show $HOSTNAME | grep addresses | cut -f3 -d'|' | rev | cut -f1 -d';'| rev | cut -c 2- | cut -f2 -d=))
echo $HOSTNAME $HOSTNET
CPMGMT="192.168.0.10"
SID=`curl -k -H "Content-Type: application/json" -H "Accept: bla" -X POST -d '{"user":"admin","password":"qwe123"}' https://$CPMGMT/web_api/login | grep sid | awk '{print $3}' | sed 's/
\"\([^"]*\)\"\,/\1/'`
echo $SID
CURLDATA=$(cat << EOF
{
"name" : "$HOSTNAME",
"ip-address" : "$HOSTNET",
"groups" : [ "vm" ]
}
EOF
)
curl -k -H "Content-Type: application/json" -H "Accept: bla" -H "X-chkp-sid: $SID" -X POST -d "$CURLDATA" https://$CPMGMT/web_api/add-host
echo "AUTO_REGISTRATION: Publishing changes"
curl -k -H "Content-Type: application/json" -H "Accept: bla" -H "X-chkp-sid: $SID" -X POST -d '{}' https://$CPMGMT/web_api/publish
sleep 10
curl -k -H "Content-Type: application/json" -H "Accept: bla" -H "X-chkp-sid: $SID" -X POST -d '{
"policy-package":"Standard",
"access":"true",
"threat-prevention":"false",
"targets":["vfw-checkpoint-gw"]
}' https://$CPMGMT/web_api/install-policy

curl -k -H "Content-Type: application/json" -H "Accept: bla" -H "X-chkp-sid: $SID" -X POST -d '{}' https://$CPMGMT/web_api/logout

동작 스크립트 및 확인

스크립트 동작 확인

[root@controller openstack]# ./CPadd.sh "svr1"
svr1 10.0.1.11
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 351 0 315 100 36 731 83 --:--:-- --:--:-- --:--:-- 730
zBbehcWoawFTBfPNKNYdPlSeD_VMzoAEHG3wufS-vM0
{
"uid" : "f4bb186d-9bcb-4078-88fd-1a1bff0e31b5",
"name" : "svr1",
"type" : "host",
"domain" : {
"uid" : "41e821a0-3720-11e3-aa6e-0800200c9fde",
"name" : "SMC User",
"domain-type" : "domain"
},
"ipv4-address" : "10.0.1.11",
"interfaces" : [ ],
"nat-settings" : {
"auto-rule" : false
},
"groups" : [ {
"uid" : "685d1904-8710-447c-a6e3-d0fd42777a40",
"name" : "vm",
"type" : "group",
"domain" : {
"uid" : "41e821a0-3720-11e3-aa6e-0800200c9fde",
"name" : "SMC User",
"domain-type" : "domain"
}
} ],
"comments" : "",
"color" : "black",
"icon" : "Objects/host",
"tags" : [ ],
"meta-info" : {
"lock" : "unlocked",
"validation-state" : "ok",
"last-modify-time" : {
"posix" : 1522745327071,
"iso-8601" : "2018-04-03T17:48+0900"
},
"last-modifier" : "admin",
"creation-time" : {
"posix" : 1522745327071,
"iso-8601" : "2018-04-03T17:48+0900"
},
"creator" : "admin"
},
"read-only" : true
}AUTO_REGISTRATION: Publishing changes
{
"task-id" : "01234567-89ab-cdef-a15a-173222678221"
}{
"task-id" : "5d97a369-b595-4e2c-9d45-59855dd9c8d7"
}{
"message" : "OK"
}[root@controller openstack]#

PING 체크 확인

AUDIT 로그 확인

그룹 정책 추가됨 확인


VM 삭제 이후 정책 제거

역순으로 처리

스크립트

중간에 그룹에서 해당 서버를 제외하는 API 추가

#!/bin/bash
. ~/admin-openrc
HOSTNAME=$1
echo $HOSTNAME $HOSTNET
CPMGMT="192.168.0.10"
SID=`curl -k -H "Content-Type: application/json" -H "Accept: bla" -X POST -d '{"user":"admin","password":"qwe123"}' https://$CPMGMT/web_api/login | grep sid | awk '{print $3}' | sed 's/\"\([^"]*\)\"\,/\1/'`
echo $SID
CURLDATA=$(cat << EOF
{
"name" : "vm",
"members" : {
"remove" : "$HOSTNAME"
}
}
EOF
)
curl -k -H "Content-Type: application/json" -H "Accept: bla" -H "X-chkp-sid: $SID" -X POST -d "$CURLDATA" https://$CPMGMT/web_api/set-group
CURLDATA=$(cat << EOF
{
"name" : "$HOSTNAME"
}
EOF
)
curl -k -H "Content-Type: application/json" -H "Accept: bla" -H "X-chkp-sid: $SID" -X POST -d "$CURLDATA" https://$CPMGMT/web_api/delete-host
echo "AUTO_REGISTRATION: Publishing changes"
curl -k -H "Content-Type: application/json" -H "Accept: bla" -H "X-chkp-sid: $SID" -X POST -d '{}' https://$CPMGMT/web_api/publish
sleep 10
curl -k -H "Content-Type: application/json" -H "Accept: bla" -H "X-chkp-sid: $SID" -X POST -d '{
"policy-package":"Standard",
"access":"true",
"threat-prevention":"false",
"targets":["vfw-checkpoint-gw"]
}' https://$CPMGMT/web_api/install-policy
curl -k -H "Content-Type: application/json" -H "Accept: bla" -H "X-chkp-sid: $SID" -X POST -d '{}' https://$CPMGMT/web_api/logout

결과


[root@controller openstack]# ./CPdel.sh "svr1"
svr1
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 351 0 315 100 36 644 73 --:--:-- --:--:-- --:--:-- 644
lAJ0iB6EP4MAnFeRXAlxQLYiYH2yjkpUZo5ooK0Uvp8
{
"uid" : "685d1904-8710-447c-a6e3-d0fd42777a40",
"name" : "vm",
"type" : "group",
"domain" : {
"uid" : "41e821a0-3720-11e3-aa6e-0800200c9fde",
"name" : "SMC User",
"domain-type" : "domain"
},
"members" : [ {
"uid" : "3db9dde2-c86e-457f-8104-7c939c7a81f4",
"name" : "dummy",
"type" : "host",
"domain" : {
"uid" : "41e821a0-3720-11e3-aa6e-0800200c9fde",
"name" : "SMC User",
"domain-type" : "domain"
},
"ipv4-address" : "169.254.169.254"
} ],
"groups" : [ ],
"comments" : "",
"color" : "black",
"icon" : "General/group",
"tags" : [ ],
"meta-info" : {
"lock" : "unlocked",
"validation-state" : "ok",
"last-modify-time" : {
"posix" : 1522745714997,
"iso-8601" : "2018-04-03T17:55+0900"
},
"last-modifier" : "admin",
"creation-time" : {
"posix" : 1522252224589,
"iso-8601" : "2018-03-29T00:50+0900"
},
"creator" : "admin"
},
"read-only" : true
}{
"message" : "OK"
}AUTO_REGISTRATION: Publishing changes
{
"task-id" : "01234567-89ab-cdef-8d00-9397c8bbfc85"
}{
"task-id" : "579620ab-fadc-4e2e-81d6-861a69922938"
}{
"message" : "OK"
}[root@controller openstack]#

정상적으로 정책에서 삭제되고 연결이 안되는 것을 확인할 수 있음.