Search

Jinja

대분류
DevOps/Tool
보안
소분류
FortiSoar
유형
문법
필터
정규표현식
최종 편집 일시
2024/10/30 02:01
생성 일시
2024/01/11 09:00
15 more properties

문법

기본 형태

기본 구분자
{{ … }} : 변수나 표현식의 결과를 출력하는 구분자(delimeter)
{% … %} : if문이나 for문 같은 제어문을 할당하는 구분자 - 파이썬 소스코드 (delimeter)
기타 문법
{% raw %} ... {% endraw %} : Escape - 템플릿 형태 동일한 텍스트를 출력하고자 할 때
{{ '{{' }} : 따옴표(‘ ’)로도 가능
{%- ... %}, {%+ ... %}, {% ... -%} ... : '+'가 붙은 쪽은 공백을 유지 시키고 '-'가 붙은 쪽은 공백을 제거

반복문 (for ~ in …)

구조
{% for <개별요소> in <리스트> %} # 리스트 길이만큼 실행 <실행코드> {% endfor %} # 종료시
Python
복사
템플릿 엔진이 제공하는 변수 목록
변    수
설    명
loop.index
for 구분이 반복된 횟수(1부터 세기 시작)
loop.index0
for 구문이 반복된 횟수(0부터 세기 시작)
loop.first
반복이 처음일 경우 True, 아닐 경우 False
loop.last
마지막 반복일 경우 True, 아닐 경우 False
loop.length
전체 반복 횟수
loop.cycle
loop.cycle()에서 안에 넣는 인자를 순서대로 전달. loop.cycle('1', '2', '3') 처럼 사용하면 반복문이 돌 때마다 순서대로 '1', '2', '3' 을 출력.
continue {%continue%}
break {%break%}

제어문(if)

구조
{% if <조건> %} <실행코드> {% elif <조건> %} <실행코드> {% else %} <실행코드> {% endif %}
Python
복사
인라인 구조
{% <실행코드> if <조건> else <거짓일때 실행코드> %}
Python
복사

형변환

{{ 데이터 | 변환할 자료형 }}
{{ number | int }}

필터

FortiSOAR 필터

fromIRI (IRI로 개체 로드)

IRI를 확인하고 거기에 있는 개체를 반환 (== ID(IRI)로 개체를 로드하는 것과 유사)
예시 형태
{{ '/api/3/events/8' | fromIRI }}{{ vars.event.alert_iri | fromIRI }} : fromIRI에 대한 값
{{ (vars.person_iri | fromIRI).name }} : 필드 반환
{{ ((vars.event.alert |fromIRI).owner| fromIRI).name }} : 재귀
{{ ('/api/3/alerts/<alert_IRI>?$relationships=true' | fromIRI).indicators }} : 실행중인 레코드에 대한 관계 데이터 검색

toDict (String to Dictionary)

액세스를 위해 String to Dictionary를 시도
{{ (request.data.incident_string | toDict).id }}

xml_to_dict (XML String to Dictionary)

액세스를 위해 XML String to Dictionary를 시도
{{ '<?xml version="1.0" ?><person><name>john</name><age>20</age></person>' | xml_to_dict }}

extract_artifacts (String to IOC)

주어진 String에서 IOC 목록을 구문 분석하고 추출
{{ 'abc.com 192.168.42.23' | extract_artifacts }}

parse_cef (CEF String to Dictionary)

주어진 CEF String을 구문 분석하고 CEF 문자열을 Dictionary로 변환
{{ 'some string containing cef' | parse_cef }}

readfile

FortiSOAR 에 다운로드된 파일의 내용 가져오기
{{ vars.result | readfile }}

ip_range

IP Address가 지정된 범위에 있는지 확인
{{ vars.ip | ip_range('198.162.0.0/24') }}

counter

항목 Array에서 각 항목의 발생 횟수 결과값: {”String”: number}
{{ data| counter }}

리스트 최소/최대 필터

min

숫자 리스트에서 최소값
{{ list | min }}

max

숫자 리스트에서 최대값
{{ list | max }}

리스트&집합 필터

unique

고유 SET {{ list1 | unique }}

union()

두 리스트의 합집합 {{ list1 | union(list2) }}

intersect()

두 리스트의 교집합 {{ list1 | intersect(list2) }}

difference()

두 리스트의 차집합 {{ list1 | difference(list2) }}

symmetric_difference()

두 리스트의 대칭차 (= XOR) {{ list1 | symmetric_difference(list2) }}

난수 필터 (random)

리스트에서의 임의 항목 {{ list | random }}
0부터 N까지 {{ N | random}}
0에서 N까지 k단위로 {{ N | random(step=k)}}
i에서 N까지 k단위로 {{ N | random(start=i, step=k)}} {{ N | random(i, k)}}
seed에서 난수 생성기 초기화 {{ N | random(seed=inventory_hostname) }}

리스트 셔플 필터 (shuffle)

기존 리스트를 무작위로 지정하여 호출 {{ ['a','b','c'] | shuffle }}

IP 주소 필터

ipaddr

문자열이 유효한 IP 주소인지 테스트 {{ myvar | ipaddr }}

ipv4/ipv6

특정 IP 프로토콜 버전의 IP 주소 {{ myvar | ipv4 }} {{ myvar | ipv6 }}

ipaddr('address')

IP 주소에서 특정 정보를 추출 {{ '192.0.2.1/24' | ipaddr('address') }}
IP 주소 목록을 필터링
test_list = ['192.24.2.1', 'host.fqdn', '::1', '192.168.32.0/24', 'fe80::100/10', True, '', '42540766412265424405338506004571095040/64'] # {{ test_list | ipaddr }} ['192.24.2.1', '::1', '192.168.32.0/24', 'fe80::100/10', '2001:db8:32c:faad::/64'] # {{ test_list | ipv4 }} ['192.24.2.1', '192.168.32.0/24'] # {{ test_list | ipv6 }} ['::1', 'fe80::100/10', '2001:db8:32c:faad::/64']
Python
복사

ipaddr('host')

IP 주소 목록에서 호스트 IP 주소
# {{ test_list | ipaddr('host') }} ['192.24.2.1/32', '::1/128', 'fe80::100/10']
Plain Text
복사

ipaddr('public')

IP 주소 목록에서 공용 IP 주소
# {{ test_list | ipaddr('public') }} ['192.24.2.1', '2001:db8:32c:faad::/64']
Plain Text
복사

ipaddr('private')

IP 주소 목록에서 개인 IP 주소
# {{ test_list | ipaddr('private') }} ['192.168.32.0/24', 'fe80::100/10']
Plain Text
복사

ipaddr('192.0.0.0/8')

쿼리로 사용되는 네트워크 범위
# {{ test_list | ipaddr('192.0.0.0/8') }} ['192.24.2.1', '192.168.32.0/24']
Plain Text
복사

해싱 필터

hash('sha1')

문자열의 sha1 해시 {{ 'test1' | hash('sha1') }}

hash('md5')

문자열의 md5 해시 {{ 'test1' | hash('md5') }}

checksum

문자열 체크섬 {{ 'test2' | checksum }}

hash('[ETC]')

기타 해시(플랫폼에 따라 다름) {{ 'test2' | hash('blowfish') }}

password_hash('sha512')

sha512 비밀번호 해시(임의 솔트) {{ 'passwordsaresecret' | password_hash('sha512') }}

password_hash('sha256', 'mysecretsalt') :

특정 솔트를 사용하여 sha256 비밀번호 해시 {{ 'secretpassword' | password_hash('sha256', 'mysecretsalt') }}

정규식 필터

regex_search

정규식 문자열 검색
# search for "foo" in "foobar" {{ 'foobar' | regex_search('(foo)') }}
Python
복사

regex_findall

정규식 일치 항목을 모두 검색
# Return a list of all IPv4 addresses in the string {{ 'Some DNS servers are 8.8.8.8 and 8.8.4.4' | regex_findall('\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b') }}
Python
복사

regex_replace

문자열의 텍스트를 정규식 변환
# convert "ansible" to "able" {{ 'ansible' | regex_replace('^a.*i(.*)$', 'a\\1') }} # convert "foobar" to "bar" {{ 'foobar' | regex_replace('^f.*o(.*)$', '\\1') }} # convert "localhost:80" to "localhost, 80" using named groups {{ 'localhost:80' | regex_replace('^(?P<host>.+):(?P<port>\\d+)$', '\\g<host>, \\g<port>') }} # convert "localhost:80" to "localhost" {{ 'localhost:80' | regex_replace(':80') }}
Python
복사

regex_escape

정규식 내에서 특수 문자 Escape
# convert '^f.*o(.*)$' to '\^f\.\*o\(\.\*\)\$' {{ '^f.*o(.*)$' | regex_escape() }}
Plain Text
복사

유용한 필터

quote

셸 사용에 대한 인용문을 추가하려면 다음을 수행하세요.
{{ string_value | quote }}

ternary()

true에 하나의 값 사용하고 false에 다른 값 사용
{{ (name == "John") | ternary('Mr','Ms') }}

join()

목록을 문자열로 연결하려면:
{{ list | join(" ") }}

basename

/etc/asdf/foo.txtfoo.txt와 같이 파일 경로의 마지막 얻기
{{ path | basename }}

win_basename

Windows 스타일 파일 경로의 마지막 얻기
{{ path | win_basename }}

win_splitdrive

Windows 드라이브 문자를 파일 경로의 나머지 부분과 분리하려면 다음을 수행하십시오. {{ path | win_splitdrive }}
first : Windows 드라이브 문자 {{ path |win_splitdrive| first }}
last : 드라이브 문자 없이 나머지 경로 {{ path |win_splitdrive| last }}

dirname

경로에서 디렉터리 이름 가져오기
{{ path | dirname }}

win_dirname

Windows 경로에서의 디렉터리 이름 가져오기
{{ path | win_dirname }}

expanduser

물결표(~) 문자가 포함된 경로 확장 {{ path | expanduser }}

realpath

링크의 실제 경로 가져오기 {{ path | realpath }}
시작점에서 링크의 상대 경로 가져오기 {{ path | relpath('/etc') }}

splitext

경로 또는 파일 이름의 루트 및 확장자 가져오기
# with path == 'nginx.conf' the return would be ('nginx', '.conf') {{ path | splitext }}

b64decode / b64encode

Base64로 인코딩된 문자열 사용
{{ encoded | b64decode }} {{ decoded | b64encode }}

to_uuid

문자열에서 UUID 생성
{{ hostname | to_uuid }}

to_datetime

문자열에서의 날짜 객체 가져오기
# get amount of seconds between two dates, default date format is %Y-%m-%d %H:%M:%S but you can pass your own one {{ (("2016-08-14 20:00:12" | to_datetime) - ("2015-12-25"|to_datetime('%Y-%m-%d'))).seconds }}
Python
복사

필터 목록

표현식

시간 작업 (Arrow)

타임스탬프

기본 {{ arrow.get('2013-05-30 12:30:45', 'YYYY-MM-DD HH:mm:ss') }}
현재 시간을 시대로 변환하고 10000 곱하기
{{ arrow.utcnow().timestamp*1000 |int| abs }}
날짜를 시대 시간으로 변환
{{ arrow.Arrow(2017, 3, 30).timestamp }}

다른시간대로 변환

날짜와 시간을 다른 시간대/형식으로 변환
{{ arrow.get( % VARIABLE % ).to('% TIME ZONE ACRONYM %').format('% FORMAT STRING%') }}
Python
복사
동부 표준시 형식으로 변환하는 예
{{arrow.get(vars.input.records[0].dateOfCompromise).to('EST').format('YYYY-MM-DD HH:mm:ss ZZ')}}
Python
복사