티스토리 뷰

Security/Cloud Native

Rego test and http.send

Jacob_baek 2023. 5. 3. 15:54

Rego 로 policy 생성시 단순히 정해진 결과만이 아닌 dynamic하게 data를 가져오는것도 가능하다.
아래와 같은 http.send 함수를 사용하여 생성이 가능하며 간단한 sample code를 기반으로 사용법을 익혀해보도록 하자.

http.send를 사용한 rego test

다음 작업을 위해서는 아래 사항이 필수적으로 존재해야 한다.

  • opa cli 설치
  • json 결과를 return 해주는 웹서버 (이는 http.send를 사용하기 위해)

위 사항이 준비되었다면 이제 rego 파일 생성과 opa command를 통한 테스트 결과를 출력해보자.
먼저 아래와 같이 json result가 출력되는 테스트 서버를 구현하고

jacob@laptop:~ $ curl http://localhost/res/jsontest.json
{
  "name": "jsontest",
  "labels": [
    {"location": "seoul"},
    {"language": "korean"}
  ]
}

아래와 같은 rego 파일을 생성한다. (실제 policy가 정의되는 rego 파일이다.)

jacob@laptop:~ $ cat httpsend.rego
package httpsendtest
import future.keywords

get_json() = retdata {
  headers_json := {"Content-Type": "application/json"}
  output := http.send({"method": "get", "url": "http://localhost/res/jsontest.json", "headers": headers_json})
  retdata := output.body.name
}

allow[response_msg] {
  retname := get_json()
  retname == input.name
  response_msg := sprintf("return name (%v) is matched with %v", [input.name, retname])
}

http.send의 경우 아래 링크에 나온 다양한 filed를 사용할 수 있다. 위 예제는 단순히 get으로 특정 url에서 data를 가져오는것이다.

여기서 body는 일반적으로 JSON 형태를 알아서 parsing 해준다.
만약 non-JSON 형태로 사용하고자 할 경우 raw_body로 처리할 수 있다.

생성된 rego 파일에 input을 다음과 같이 파일로 생성한다.

$ cat input.json
{
  "name": "jsontest"
}

이제 생성한 data(input.json)와 policy(rego)를 기반으로 검증을 해보자.
opa eval 명령을 수행할 예정이며 여기서 query는 사용한 package명과 allow와 같은 rego파일내 정의된 함수명을 사용하면 된다.

jacob@laptop:~ $ opa eval -d httpsend.rego -i input.json "data.httpsendtest.allow"
{
  "result": [
    {
      "expressions": [
        {
          "value": [
            "return name (jsontest) is matched with jsontest"
          ],
          "text": "data.httpsendtest.allow",
          "location": {
            "row": 1,
            "col": 1
          }
        }
      ]
    }
  ]
}
jacob@laptop:~ $ opa eval -d httpsend.rego -i input.json "data.httpsendtest.allow" | jq -r '.result[].expressions[].value[]'return name (jsontest) is matched with jsontest

만약 허용되지 않는 조건인 name이 matching되지 않도록 아래와 같이 변경한 경우

jacob@laptop:~ $ cat input.json
{
  "name": "invalidjsontest"
}

아래와 같이 allow에 대한 value는 empty 상태로 반환되어진다.

jacob@laptop:~ $ opa eval -d httpsend.rego -i input.json "data.httpsendtest.allow"
{
  "result": [
    {
      "expressions": [
        {
          "value": [],
          "text": "data.httpsendtest.allow",
          "location": {
            "row": 1,
            "col": 1
          }
        }
      ]
    }
  ]
}

참고
https://play.openpolicyagent.org/ 에서는 http.send를 보안적이유로 사용할 수 없다.
실제 htt.send를 호출해보면 아래와 같은 output이 출력된다.
"1 error occurred: policy.rego:34: rego_type_error: unsafe built-in function calls in expression: http.send"

 

정리하자면 다음 파일을 생성하여 테스트를 진행할수 있으며

  • httpsendtest.rego
  • input.json
  • opa cli

httpsendtest.rego내에 http.send를 통한 외부 데이터를 가져와 사용이 가능하다는것을 확인할수 있었다.

참고사이트

'Security > Cloud Native' 카테고리의 다른 글

Gatekeeper Library  (0) 2023.06.04
Gatekeeper mutatation  (0) 2023.05.04
trivy db search  (0) 2023.04.02
Hashicorp Boundary  (0) 2020.10.28
How to use Hashicorp boundary  (0) 2020.10.24
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함