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 토큰 관련 문서를 확인하시기 바랍니다.] (새 탭에서 열림)

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 게이트웨이 영역에 접근할 수 있는 위치를 보여줍니다.

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

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 탐색기에서 엔드포인트 데이터를 가져와 보겠습니다. 아래 사진은 모든 엔드포인트와 해당 운영 체제를 조회하는 방법을 보여줍니다.

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

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

이 “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 플랫폼 통합 과정을 간소화하고 가속화함으로써, 기술 투자의 가치를 극대화하는 동시에 위험과 운영상의 비효율을 줄여줍니다.




