메인 콘텐츠로 건너뛰기
API 게이트웨이와 GraphQL을 사용하여 Tanium에서 데이터 가져오기
기술 인사이트

API 게이트웨이와 GraphQL을 사용하여 Tanium에서 데이터 가져오기

API Gateway와 GraphQL을 활용하여 풍부한 Tanium 데이터로 자체 앱을 구동하세요

Tanium은 매우 강력한 플랫폼이며, 많은 사용자가 자체 도구를 사용하여 Tanium에서 데이터를 추출해야 할 수도 있습니다. Tanium Connect는 언제든지 데이터를 내보내어 제품, 서버 또는 파일로 각각 전송할 수 있지만, 때로는 사용자가 데이터를 수신하는 대신 수동으로 데이터를 가져와야 할 수도 있습니다. Tanium의 새로운 API 게이트웨이를 사용하면 이 과정을 아주 손쉽게 처리할 수 있습니다. 이 블로그에서는 파이썬을 통해 Tanium에 로그인하고 컴퓨터 데이터를 조회하는 방법을 알려드리겠습니다.

요구 사항

  • 최신 API 게이트웨이 솔루션이 통합된 Tanium 환경. 이 블로그는 버전 1,3,64,0000에서 테스트되었습니다.
  • Python 3 with “requests” and “JSON” libraries

인증

Tanium에서 데이터를 가져오기 전에, 먼저 로그인이 가능한지 확인해야 합니다. 로그인 방법에는 두 가지가 있습니다. Tanium 사용자 이름/비밀번호를 사용하는 방법과 API 토큰을 사용하는 방법입니다. SSO를 통해 로그인하거나 Tanium Cloud를 사용하는 경우 사용자 이름과 비밀번호로 로그인할 수 없으므로, 사용자의 Tanium 환경이 이와 같은 경우라면 API 토큰을 사용해야 합니다.

API 토큰 생성하기

API 토큰을 생성하려면 평소와 같이 Tanium 서버에 로그인한 후, “관리(Administration)” 메뉴에서 API 토큰 옵션을 찾아야 합니다.

[참고: API 토큰을 생성하려면 특정 권한이 필요합니다. 자세한 내용은 여기에서 Tanium의 API 토큰 관련 문서를 확인하시기 바랍니다.] (새 탭에서 열림)

스크린샷 1: Tanium 콘솔 내에서 API 토큰을 생성할 수 있는 위치를 보여주는 화면
스크린샷 1: API 토큰을 생성할 위치를 보여주는 화면

API 토큰 페이지에 접속한 후, 화면 오른쪽에 있는 “새 API 토큰” 버튼을 클릭하면 됩니다. 이를 통해 토큰을 생성하고, 토큰의 유효 기간을 지정하며, 이 API 토큰을 사용할 수 있는 API 주소를 설정할 수 있습니다. 모달을 작성한 후, 제한된 시간 동안 토큰을 표시하는 팝업이 나타납니다. 팝업 창이 닫히면 이 토큰을 확인할 수 없으므로 잘 기억해 두시기 바랍니다.

사용자 이름과 비밀번호를 사용하여 Tanium에 로그인하기

Tanium 환경에서 SSO를 통해 로그인하지 않는 경우, 사용자 이름과 비밀번호를 사용하여 인증한 후 Tanium API를 이용할 수 있습니다. 아래 함수는 사용자 이름과 비밀번호를 사용하여 Tanium 서버에 로그인하고 세션 토큰을 추출하는 방법을 보여주는 예시입니다.

[참고: 이 세션 토큰은 일정 시간 동안 활동이 없을 경우 만료되므로, 필요에 따라 재인증해야 할 수 있습니다.]

코드 블록 1: 사용자 이름/비밀번호를 통해 세션 토큰 가져오기

def loginUsernamePassword(ts: str, username: str, password: str) -> str:
"""
사용자 이름과 비밀번호 조합을 사용하여
를 통해 Tanium 서버에 로그인하는 방법을 보여주는 예제 함수입니다. 이 코드는
세션 토큰을 반환합니다.
매개변수 ts는 사용할 Tanium 서버를 나타냅니다.
매개변수 username은 로그인 시 사용할 사용자 이름입니다.
매개변수 password는 로그인 시 사용할 비밀번호입니다.
"""
payload = {}
payload["username"] = username
payload["password"] = password
r = requests.post(f"{ts}/api/v2/session/login",
json=payload
)

session_token = r.json()['data']['session']
print(f"로그인 시 수신된 상태 코드: {r.status_code}")
return session_token

인증 테스트

API 토큰이 생성되면 인증 테스트를 시작할 수 있습니다. Tanium 서버로 전송되는 모든 HTTPS 요청에는 API 토큰을 헤더로 포함해야 합니다. Tanium 콘솔의 ‘API 토큰’ 페이지에서 또는 사용자 이름과 비밀번호를 사용하여 로그인한 후 세션 토큰을 수신하면, 해당 토큰이 정상적으로 작동하는지 확인합니다. 이는 Tanium 서버에서 /api/v2/session/validate 경로를 호출하여 수행할 수 있습니다. 아래 기능 블록에는 이를 구현하는 방법이 예시로 나와 있습니다.

코드 블록 2: API/세션 토큰의 유효성 확인


def validateToken(ts: str, token: str):
"""
API 토큰이
Tanium 서버에 접속하여 200 응답을 받을 수 있는지 확인하는 예제 함수입니다.

매개변수 ts는 사용할 Tanium 서버를 나타냅니다.
예시: 'https://MyTaniumServer.com'
매개변수 token은 TS GUI에서 생성된 API 토큰 문자열입니다.
"""

r = requests.post(f"{ts}/api/v2/session/validate",
json={'session': token},
headers={'session': token}
)


# 토큰 유효성 검사가 성공하면 status_code는 200 이어야 합니다.
print(f"토큰 유효성 검사 결과 상태 코드: {r.status_code}.")

API 게이트웨이 및 GraphQL 사용

Tanium 서버에 성공적으로 로그인하고 토큰을 검증한 후, API 게이트웨이에 쿼리를 보내 환경에 대한 정보를 추출할 수 있습니다. GraphQL을 사용해 본 적이 없다면, GraphQL이 무엇인지와 쿼리 언어가 어떻게 작동하는지에 대해 간단히 알아보기 위해 관련 문서를 살펴보는 것이 좋습니다. 해당 웹사이트는 다음 주소에서 확인할 수 있습니다: https://graphql.org/learn/ (새 탭에서 열림).

Tanium API를 통해 작업을 자동화하기 전에, Tanium 콘솔의 API 게이트웨이에 접속하여 쿼리할 수 있는 데이터 필드를 살펴볼 수 있습니다. 사진 2 은 Tanium 콘솔에서 API 게이트웨이 영역에 접근할 수 있는 위치를 보여줍니다.

스크린샷 2: Tanium 콘솔에서 API 게이트웨이가 위치한 곳 표시
스크린샷 2: Tanium 콘솔에서 API 게이트웨이가 위치한 곳 표시

이 페이지에 접속하면, 다양한 쿼리를 탐색하고 실험해 보며 실제 데이터를 가져올 수 있는 대화형 GraphQL IDE를 확인할 수 있습니다. 사진 3 을 참고하시면, 서버에서 반환한 현재 시간을 확인하기 위한 초기 쿼리를 실행할 수 있습니다.

스크린샷 3: Tanium 콘솔에서 간단한 GraphQL 쿼리 실행하기
스크린샷 3: Tanium 콘솔에서 간단한 GraphQL 쿼리 실행하기

Tanium 콘솔의 대화형 GraphQL 쿼리를 활용하면 쿼리를 탐색하고 작성한 후, 이를 Python 스크립트로 가져와 자동화할 수 있습니다. 예를 들어, 아래와 같이 동일한 “{now}” 쿼리를 실행하는 아주 간단한 파이썬 함수를 만들 수 있습니다.

코드 블록 3: 파이썬을 통해 ‘now’ 쿼리 실행하기

def graphQLQueryNow(ts: str, token: str):
"""

graphQLQueryNow는 이 함수에 전달된 Tanium 서버를 대상으로 'now' GraphQL 쿼리
를 실행합니다.

ts 매개변수는 사용할 Tanium 서버를 나타냅니다.
token 매개변수는 ts GUI에서 생성된 API 토큰 문자열입니다.
"""

jsonObj = {'query': "{now}"}

r = requests.post(ts + "/plugin/products/gateway/graphql",
json=jsonObj,
headers={'session': token},
)

print(f"'now' 쿼리에서 수신된 상태 코드: {r.status_code}")
print(f"'now' 쿼리의 JSON 응답: {r.json()}")

이것은 파이썬을 통해 첫 번째 Tanium 쿼리를 실행하는 데 있어 훌륭한 시작이지만, 이제 Tanium 콘솔의 대화형 GraphQL 탐색기에서 엔드포인트 데이터를 가져와 보겠습니다. 아래 사진은 모든 엔드포인트와 해당 운영 체제를 조회하는 방법을 보여줍니다.

스크린샷 4: 모든 엔드포인트 및 해당 운영 체제 조회하기
스크린샷 4: 모든 엔드포인트 및 해당 운영 체제 조회하기

드디어 엔드포인트 데이터가 나오기 시작했지만, 아직 한 가지 빠진 부분이 있습니다. 사용 중인 환경에 20 대 이하의 시스템이 있는 경우가 아니라면, 이 데이터가 전체 환경에 대한 정보를 제공하지 않는다는 것을 알 수 있을 것입니다. GraphQL은 기본적으로 페이지 분할 기능이 활성화되어 있으므로, 전체 환경의 데이터 세트를 모두 가져오려면 여러 번의 요청을 보내야 합니다. 페이징 정보를 표시하도록 쿼리를 확장해 봅시다. 그러면 파이썬 스크립트를 통해 자동화할 때 이를 어떻게 파싱해야 하는지 알 수 있을 것입니다.

스크린샷 5: GraphQL 쿼리에서 “pageInfo” 정보 활성화하기
스크린샷 5: GraphQL 쿼리에서 “pageInfo” 정보 활성화하기

이 “pageInfo” 데이터가 활성화되면, “hasNextPage” 필드를 통해 서버에 파싱해야 할 데이터가 더 남아 있는지 확인할 수 있습니다. 또한, “startCursor” 및 “endCursor” 필드를 확인함으로써 데이터셋 내에서 현재 위치를 파악할 수 있습니다. 다음 데이터 세트를 가져오려면, 아래와 같이 엔드포인트 쿼리에 (after: “lastcursor”)를 추가하기만 하면 됩니다.

스크린샷 6: GraphQL에서 커서를 사용하여 다음 데이터 세트로 이동하기
스크린샷 6: GraphQL에서 커서를 사용하여 다음 데이터 세트로 이동하기

이 “after” 인수를 엔드포인트 쿼리에 추가하면, 결과 데이터가 다음 20 대의 머신으로 구성된 집합임을 알 수 있습니다. 이제 데이터를 페이지 단위로 나누는 방법을 알았으니, 드디어 모든 내용을 하나의 파이썬 스크립트에 통합하여 자동으로 쿼리를 실행할 수 있게 되었습니다.

코드 블록 4: 전체 데이터셋을 쿼리하기 위해 모든 내용을 종합하기


def graphQL_pagination(ts: str, token: str):
"""

graphQL_pagination은
의 GraphQL 및 페이지 분할 기능을 사용하여 모든 엔드포인트의 이름을 지정하고 OS를 처리합니다.

ts 매개변수는 사용할 Tanium 서버를 나타냅니다.
token 매개변수는 ts GUI에서 생성된 API 토큰 문자열입니다.
"""

init_query = '''
{
endpoints {
pageInfo {
startCursor
endCursor
hasNextPage
}
edges {
node {
name
os {
name
}
}
}
}
}
'''

def do_request(ts: str, token: str, queryString: str) -> requests.Response:
r = requests.post(ts + "/plugin/products/gateway/graphql",
json={'query': queryString},
headers={'session': token},
)
return r

endpoint_data = []
next_query = init_query
while True:

# 요청을 수행하고, 응답을 JSON 형식으로 변환합니다.
r = do_request(ts, token, next_query)
resp_obj = r.json()

# JSON 객체
에서 페이지 정보를 추출합니다. has_next_page = resp_obj["data"]["endpoints"]["pageInfo"]["hasNextPage"]
end_cursor = resp_obj["data"]["endpoints"]["pageInfo"]["endCursor"]
start_cursor = resp_obj["data"]["endpoints"]["pageInfo"]["startCursor"]

# 사용자에게 커서가 현재 어느 위치에 있는지 알려줍니다.
print(
f"시작: {start_cursor}과 끝: {end_cursor} 사이의 끝점에 대한 데이터를 수신했습니다.")

# 엔드포인트 데이터를 리스트 객체에 추가합니다
endpoint_data.extend(resp_obj["data"]["endpoints"]["edges"])

# 다음 페이지가 "False"라면 데이터셋의 끝까지 도달한 것입니다!
if not has_next_page:
break

# "after" 인수를 원래 쿼리에 삽입합니다.
next_query = init_query[:25] + \
f"(after: \"{end_cursor}\") " + init_query[25:]

이 글이 Tanium 외부에서 API Gateway를 사용하는 방법을 이해하는 데 도움이 되기를 바랍니다. Tanium Connect에서 제공하는 기본 커넥터를 사용하기만 해도 많은 사용 사례를 구현할 수 있다는 점을 잊지 마세요. 맞춤형 통합 기능을 구축해야 할 때 API 게이트웨이는 매우 유용한 도구이며, 모듈 지원 기능을 비롯해 매주 새로운 기능이 추가되고 있습니다. 로드맵 관련 항목에 대한 자세한 정보나 API 게이트웨이 관련 작업을 지원받으시려면 Tanium 담당자에게 문의해 주십시오.

의 Tanium 통합 갤러리( , 새 탭에서 열림)를 통해 Tanium 플랫폼의 잠재력을 최대한 활용하는 방법을 알아보세요. 이 중앙 집중식 콘솔은 모든 통합 기능에 대한 실시간 가시성을 제공하며, 고객이 손쉽게 통합 기능을 검색, 구성 및 배포할 수 있도록 지원합니다. Tanium 통합 갤러리는 Microsoft, ServiceNow 등 주요 기술 파트너와의 Tanium 플랫폼 통합 과정을 간소화하고 가속화함으로써, 기술 투자의 가치를 극대화하는 동시에 위험과 운영상의 비효율을 줄여줍니다.