Ranger REST API 로 Atlas 서비스 정책에 rangerlookup 사용자와 entity-read 권한을 넣은 뒤, UI 에서 권한이 비어 보이거나 특정 노드에서 정책이 적용되지 않을 때 어디를 확인해야 하는지 정리한다. 확인 순서는 API 응답 → Ranger DB 의 policy_text → Plugin Status 의 노드별 Download/Active 시각이다.
# 현재 정책 JSON 저장
curl -k -u admin:${PASSWORD} \
"https://<RANGER_HOST>:6182/service/public/v2/api/policy/<POLICY_ID>" -o policy.json
# policyItems 만 빠르게 보기
curl -sk -u admin:${PASSWORD} \
"https://<RANGER_HOST>:6182/service/public/v2/api/policy/<POLICY_ID>" | python3 -c "
import json, sys
p = json.load(sys.stdin)
for i, item in enumerate(p.get('policyItems', [])):
print(f'Row {i}: users={item[\"users\"]}, accesses={item[\"accesses\"]}')
"
# 수정 후 PUT
curl -k -u admin:${PASSWORD} -X PUT -H "Content-Type: application/json" \
-d @policy_modified.json \
"https://<RANGER_HOST>:6182/service/public/v2/api/policy/<POLICY_ID>"
policyItem 은 accesses 가 비어 있으면 사용자만 들어가고 권한은 빠진다.
{
"accesses": [{"type": "entity-read", "isAllowed": true}],
"users": ["rangerlookup"],
"groups": [],
"roles": [],
"conditions": [],
"delegateAdmin": false
}
최근 버전의 Ranger 는 x_policy_item 계열 테이블이 아니라 x_policy.policy_text 컬럼에 정책 전체를 JSON 으로 저장한다(x_policy_ref_* 구조).
SELECT id, name, version, update_time, policy_text FROM x_policy WHERE id = <POLICY_ID>;
-- rangerlookup 이 들어간 policyItem 만
SELECT item->>'users' AS users, item->>'accesses' AS accesses
FROM x_policy, jsonb_array_elements(policy_text::jsonb -> 'policyItems') AS item
WHERE id = <POLICY_ID> AND item->>'users' LIKE '%rangerlookup%';
accesses 에 entity-read 가 있으면 API PUT 은 정상 반영된 것이고, 문제는 플러그인 동기화 쪽이다.
Ranger UI → Audit → Plugin Status 에서 서비스별 · 호스트별 Download / Active 시각을 본다. 이 사례에서는 Atlas 두 노드 중 한 노드의 시각이 한 달 전에 멈춰 있었다. 그 노드는 정책을 받아가지 못하므로 새 권한이 동작하지 않는다.
# 플러그인이 받아가는 정책 내려받기
curl -k -u admin:${PASSWORD} \
"https://<RANGER_HOST>:6182/service/plugins/secure/download/cm_atlas" | python3 -m json.tool | grep -A5 rangerlookup
# 문제 노드에서 Ranger Admin 접근 확인
curl -k -u admin:${PASSWORD} "https://<RANGER_HOST>:6182/service/public/v2/api/policy/<POLICY_ID>"
# 문제 노드의 Atlas 내 Ranger 플러그인 로그
grep -i "PolicyRefresher\|policy.*download\|ranger.*error" /var/log/atlas/application.log | tail -100
Ranger Admin 로그에는 SUPPORTS_POLICY_DELTAS=true 가 찍혀 있었다. 델타 방식은 변경분만 증분으로 받는데, 어느 시점에 델타 체인이 끊기면 해당 노드만 이후 변경을 받지 못한다. 플러그인 정책 캐시(policycache 아래 *.json) 를 찾아 지우고 다시 받게 하거나, 같은 정책을 그대로 다시 PUT 해 version 을 올리는 것이 조치 후보다.
find /etc/ranger /var/lib/ranger /opt/cloudera -path "*policycache*" 2>/dev/null
grep "ranger.externalurl" /etc/ranger/admin/conf/ranger-admin-site.xml
로그에 ERROR RangerConfigUtil: webapp URL is not set. Please set ranger.externalurl property 가 있으면 ranger.externalurl 도 채운다.
DB 에는 정상 저장됐고 정상 노드는 동기화됐지만, 한 달째 정책을 받지 못한 노드의 원인(델타 체인 단절 · 캐시 손상 여부) 은 확인 전에 대화가 끝났다.