세션 속성
Mattermost v12.0요약
Mattermost v12부터 권한 정책은 사용자 속성 외에 세션 속성도 평가할 수 있습니다. 이를 통해 "회사 IP 대역에서만 파일 다운로드 허용" 또는 "탈옥된 모바일 기기에서의 업로드 차단"과 같은 규칙을 작성할 수 있습니다.
사용 가능 플랜: Entry, Enterprise Advanced
Mattermost v12부터 권한 정책은 사용자 속성 외에 세션 속성도 평가할 수 있습니다. 사용자 속성은 누군가가 누구인지를 설명합니다. 세션 속성은 그 사람이 지금 어떻게 연결하고 있는지를 설명하며, 사용 중인 네트워크, 사용 중인 클라이언트, 기기의 상태 등이 여기에 해당합니다.
이를 통해 "회사 IP 대역에서만 파일 다운로드 허용" 또는 "탈옥된 모바일 기기에서의 업로드 차단"과 같은 규칙을 작성할 수 있습니다. 세션 속성은 정책 표현식에서 user.session.<name>으로 참조하며, 예를 들면 user.session.vpn_active == "true"와 같습니다.
세션 속성은 권한 정책에서만 사용할 수 있으며 멤버십 정책에서는 사용할 수 없습니다.
세션 속성의 작동 방식#
수집#
세션 속성은 두 가지 출처에서 가져옵니다.
- 서버에서 파생된 속성은 Mattermost 서버가 요청 자체에서 측정합니다. 연결의 IP 주소와
User-Agent헤더가 여기에 해당합니다. - 클라이언트가 보고하는 속성은 Desktop App 또는 모바일 앱이 운영 체제의 네이티브 API를 사용해 수집하고
X-MM-Session-Attributes요청 헤더에 담아 서버로 보냅니다.
클라이언트는 사용자가 활성화한 항목만 수집합니다. 클라이언트가 연결하면 서버는 해당 플랫폼에 적용되는 속성과 각 속성을 새로 고치는 주기를 알려 줍니다. 서버는 예상하지 못한 값, 예를 들어 비활성화된 속성의 값이나 해당 플랫폼에서 지원할 수 없는 속성의 값은 무시합니다.
보고된 값은 세션의 메모리 내 캐시에 보관됩니다. 데이터베이스에 기록되지 않고, 컴플라이언스 내보내기에 포함되지 않으며, 사용자가 로그아웃하거나 세션이 취소되거나 만료되면 폐기됩니다.
플랫폼 지원 여부#
모든 클라이언트가 모든 속성을 보고할 수 있는 것은 아닙니다. System Console과 세션 속성 참조의 플랫폼 칼럼에 각 속성을 지원하는 클라이언트가 표시됩니다.
- 웹 브라우저는
os_platform,vpn_active,client_ip_address와 같은 기기 또는 네트워크 속성을 보고할 수 없습니다. 브라우저는 이를 측정하는 데 필요한 운영 체제 API에 접근할 수 없기 때문입니다. 관리되는 데스크톱 및 모바일 클라이언트만 허용하려는 경우 이는 의도한 동작입니다. 측정할 수 있는 곳에서만 보안 상태를 확인하려면 브라우저 세션이 의도적으로 처리되도록 규칙을 작성하세요. - 데스크톱의 네이티브 기기 및 네트워크 수집은 Windows와 macOS에서만 구현되어 있습니다. 다른 플랫폼의 데스크톱 세션에서는 이러한 속성이 없습니다.
- 모바일 사용자는
ssid가 활성화되면 위치 접근 권한을 요청받습니다. iOS와 Android가 Wi-Fi 네트워크 정보를 해당 권한 뒤에 두기 때문입니다. Mattermost는 현재 네트워크의 이름만 읽으며 기기 위치는 수집하지 않지만, 권한을 거부한 사용자는 SSID를 보고하지 않으므로 SSID를 요구하는 모든 규칙에서 접근이 거부됩니다. 세션 속성 수집을 참조하세요.
TTL과 유예 기간#
각 속성에는 값이 얼마나 최신이어야 하는지를 제어하는 두 가지 타이머가 있습니다.
- TTL(time-to-live): 클라이언트가 속성을 다시 보고하기 전까지 기다리는 시간입니다. TTL이 짧으면 요청 크기가 약간 커지는 대신 값이 최신 상태로 유지되고, TTL이 길면 오버헤드는 줄지만 값이 오래될 수 있습니다.
- 유예 기간: TTL이 지난 후에도 Mattermost가 마지막으로 보고된 값을 계속 사용하는 시간입니다. 새 보고 없이 TTL과 유예 기간이 모두 지나면 해당 속성은 없는 것으로 처리되며, 이 속성을 참조하는 규칙은 접근을 거부합니다.
기본값은 속성마다 다릅니다. 세션 속성 참조를 확인하세요. 두 타이머 모두 15초, 30초, 1분, 5분, 1시간, 24시간의 프리셋을 제공합니다. 서버에서 파생된 속성은 Mattermost가 모든 요청에서 측정하므로 이러한 타이머의 영향을 받지 않습니다.
유예 기간은 짧은 네트워크 중단을 흡수합니다. 유예 기간이 지나치게 짧으면 클라이언트가 값을 따라잡는 동안 불안정한 연결을 사용하는 사용자가 간헐적으로 거부될 수 있습니다.
개인정보 보호#
수집은 서버에서 선택적으로 활성화하며 클라이언트에서는 기본적으로 켜져 있습니다. 시스템 관리자가 활성화하지 않으면 어떤 속성도 수집되지 않습니다.
Desktop App 사용자는 설정 > 고급 > 세션 속성 활성화를 선택 해제하여 속성 보고를 중단할 수 있으며, 그러면 클라이언트가 보고하는 속성에 의존하는 모든 규칙이 해당 사용자를 거부합니다. 이 설정이 활성화되어 있는 동안 Desktop App은 수집할 수 있는 모든 속성과 현재 보고하는 값을 사용자에게 보여 줍니다. 이를 사용자에게 안내하는 방법은 세션 속성 수집을 참조하세요.
세션 속성 설정#
사전 요구 사항#
- Mattermost Enterprise Advanced 라이선스.
- System Console > System Attributes > Attribute-Based Access에서 속성 기반 접근 제어를 활성화해야 합니다.
- 클라이언트가 보고하는 속성에는 Mattermost Desktop App v6.3 이상 또는 Mattermost 모바일 앱 v2.44 이상이 필요합니다. 웹 브라우저와 이전 버전 앱은 일부 속성만 보고할 수 있습니다. 플랫폼 지원 여부를 참조하세요.
단계#
- 필요한 속성을 활성화합니다. System Console에서 System Attributes > Session Attributes로 이동합니다. 모든 속성은 기본적으로 비활성화되어 있습니다. 사용하려는 각 속성에서 더보기
를 선택한 다음 활성화를 선택합니다.
- 타이머를 조정합니다(선택 사항). 같은 더보기 메뉴에서 클라이언트가 속성을 보고하는 빈도와 보고된 값을 사용할 수 있는 시간을 변경할 수 있습니다. TTL과 유예 기간을 참조하세요.
- 권한 정책에 규칙을 추가합니다. 권한 정책을 만들거나 편집하고 해당 속성을 사용하는 규칙을 추가합니다. 세션 속성 규칙 작성을 참조하세요.
- 접근을 시뮬레이션합니다. 접근 시뮬레이션을 사용하여 실제 사용자가 실제로 사용하는 클라이언트에서 어떤 결과가 나오는지 확인합니다.
- 정책을 저장합니다.
규칙을 작성하기 전에#
- 속성이 없으면 접근이 거부됩니다. 규칙이 세션에 없는 속성을 참조하면 사용자는 거부됩니다. 이는 속성이 한 번도 보고되지 않았거나, 비활성화되었거나, 사용자의 클라이언트에서 지원되지 않거나, TTL과 유예 기간을 지나 오래된 경우에 모두 적용됩니다. 이는 의도된 동작입니다. 그렇지 않으면
user.session.jailbreak_detected != "true"와 같은 규칙이 속성을 생략하는 모든 클라이언트, 의도적으로 생략하는 클라이언트까지 통과시키기 때문입니다. - 모든 규칙은 클라이언트 요구 사항이기도 합니다. 웹 브라우저는 기기 또는 네트워크 속성을 보고할 수 없으므로, 이러한 속성을 사용하는 규칙은 웹 앱 사용자를 포함한 모든 브라우저 사용자를 거부합니다. 예를 들면 다음과 같습니다.
user.session.os_platform == "windows"는 Windows가 아닌 데스크톱뿐 아니라 모든 브라우저 및 모바일 세션을 거부합니다.user.session.vpn_active == "false"는 브라우저 세션이vpn_active를 보고하지 않으므로 브라우저 세션을 거부합니다.user.session.hardware_id != ""는 모든 모바일 및 브라우저 세션과 네이티브 수집이 없는 플랫폼의 모든 데스크톱 세션을 거부합니다.
- 값은 대소문자를 구분합니다.
user.session.ssid == "corp-wifi"는Corp-WiFi라는 이름의 네트워크와 일치하지 않습니다. 이는ssid와client_fqdn같은 자유 텍스트 속성에서 가장 중요합니다. - 부울 값은 문자열입니다.
vpn_active,mdm_enrolled,jailbreak_detected는 문자열"true"와"false"로 보고되므로 문자열로 비교해야 합니다. 예를 들면user.session.mdm_enrolled == "true"입니다. - 속성을 비활성화하면 해당 속성을 사용하는 규칙이 작동하지 않습니다. Mattermost는 비활성화되었거나 알 수 없는 속성을 참조하는 정책의 저장을 차단하지만, 기존 정책이 이미 사용 중인 속성을 비활성화해도 해당 정책이 무효화되지는 않습니다. 이 경우 정책은 모든 사용자를 거부합니다.
- 클라이언트가 보고하는 값은 자체 증명입니다. 증거가 아니라 보안 상태 신호로 취급하세요. 사용자가 세션 속성을 위조할 수 있습니까?를 참조하세요.
세션 속성으로 접근 시뮬레이션#
접근 시뮬레이션은 저장하기 전에 선택한 사용자를 대상으로 초안 정책을 평가합니다. 규칙이 user.session.*을 참조하는데 선택한 사용자에게 캐시된 세션 속성이 없으면, Mattermost는 허용 또는 거부 대신 중립적인 최근 세션 없음 결과를 표시합니다.
최근 세션 없음은 평가할 세션 데이터가 없었다는 뜻이며 사용자가 거부된다는 뜻이 아닙니다. 보통 사용자가 규칙에서 사용하는 속성을 보고하는 클라이언트로 최근에 연결하지 않았음을 의미합니다. 대상으로 삼은 클라이언트에서 사용자가 연결하게 한 다음 시뮬레이션을 다시 실행하세요.
세션 속성 규칙 작성#
활성화된 세션 속성은 권한 정책 편집기에서 사용자 속성과 함께 나타납니다. 간단한 편집기에서는 os_platform, vpn_active, user_agent_browser_name처럼 값이 고정된 속성의 값을 드롭다운으로 제공합니다. 고급 모드 CEL 편집기에서는 user.session.<name>으로 속성을 참조하고 일반적인 CEL 연산자와 조합합니다.
user.session.mdm_enrolled == "true" || user.session.os_platform in ["macos", "windows"]
IP 범위 및 버전 조건#
Mattermost는 IP 주소를 서브넷과 대조하는 연산자와 버전을 비교하는 연산자를 별도로 제공합니다. 간단한 편집기에서는 지원되는 속성을 선택한 후 연산자 메뉴에 나타납니다. CEL 편집기에서는 속성에 대한 함수로 작성합니다.
user.session.<name>.<function>("<value>")
| 연산자 | CEL 함수 | 확인 내용 | 사용 가능한 속성 |
|---|---|---|---|
| IP 범위 내 | inCIDR |
IP 주소가 10.0.0.0/8과 같이 지정한 CIDR 블록 안에 있습니다. |
ip_address, client_ip_address |
| 버전이 다음과 같음 | versionEQ |
버전이 지정한 버전과 정확히 일치합니다. | os_version, client_version, user_agent_browser_version |
| 버전이 다음 이상임 | versionGTE |
버전이 지정한 버전과 같거나 더 최신입니다. | os_version, client_version, user_agent_browser_version |
| 버전이 다음보다 큼 | versionGT |
버전이 지정한 버전보다 엄격하게 더 최신입니다. | os_version, client_version, user_agent_browser_version |
| 버전이 다음 이하임 | versionLTE |
버전이 지정한 버전과 같거나 더 오래되었습니다. | os_version, client_version, user_agent_browser_version |
| 버전이 다음보다 작음 | versionLT |
버전이 지정한 버전보다 엄격하게 더 오래되었습니다. | os_version, client_version, user_agent_browser_version |
여러 주소 범위를 허용하려면 inCIDR 검사를 ||로 연결합니다.
user.session.ip_address.inCIDR("10.0.0.0/8") || user.session.ip_address.inCIDR("192.168.0.0/16")
지원되는 버전을 실행하며 회사 서브넷에 있는 관리되는 Windows 데스크톱 클라이언트를 요구하려면 다음과 같이 작성합니다.
user.session.os_platform == "windows" && user.session.mdm_enrolled == "true" && user.session.ip_address.inCIDR("10.0.0.0/8") && user.session.client_version.versionGTE("6.3.0")
다음 사항에 유의하세요.
- 버전 비교는 유의적 버전 관리(semantic versioning)를 따르므로
6.10.0은6.9.0보다 최신입니다. 앞에 붙은v와6.3처럼 축약된 버전도 허용됩니다.6.3.0-rc1과 같은 프리릴리즈 버전은 같은 정식 릴리즈보다 앞에 정렬됩니다. client_version을 정확히 일치시키는 방식은 피하세요. 클라이언트마다 빌드 번호 형식이 다르므로,client_version == "2.44.0+807"은 한 클라이언트와는 일치하고 같은 릴리즈를2.44.0+6000807로 보고하는 다른 클라이언트는 거부할 수 있습니다. 버전이 다음 이상임을 사용하거나2.44와 같은 축약 버전과 비교하세요.- IP 체계가 일치해야 합니다. IPv4 범위는 IPv4 주소와만 일치합니다.
client_ip_address는 IPv4를 우선하지만 기기에 사용할 수 있는 IPv4 주소가 없으면 IPv6로 대체하며,ip_address는 연결이 도착한 체계를 그대로 따릅니다. 듀얼 스택 네트워크에서는 두 체계를 모두 다루세요. - 구문 분석할 수 없는 값은 접근을 거부합니다. 속성에 올바른 IP 주소나 버전이 들어 있지 않으면 사용자는 거부됩니다.
- CEL 편집기에서 저장하기 전에 구문 검증을 선택하여 잘못 입력한 함수 이름과 잘못된 형식의 CIDR 블록 또는 버전 문자열을 확인하세요.
신뢰할 수 있는 프록시 헤더와 inCIDR 규칙#
ServiceSettings.TrustedProxyIPHeader가 구성되어 있으면 Mattermost는 연결 대신 해당 헤더에서 ip_address를 가져옵니다. ip_address에 대한 inCIDR 규칙은 클라이언트가 Mattermost 서버에 직접 접근할 수 없고 동시에 리버스 프록시가 모든 인바운드 요청에서 헤더를 실제 클라이언트 주소로 덮어쓸 때만 신뢰할 수 있습니다. 프록시가 클라이언트가 제공한 값에 덧붙이거나 클라이언트가 프록시를 우회할 수 있다면 주소를 공격자가 제어할 수 있게 되며, 그 주소를 기반으로 한 모든 네트워크 규칙을 마음대로 충족시킬 수 있습니다.
VPN 감지#
vpn_active는 트래픽을 검사하는 방식이 아니라 기기에 존재하는 네트워크 인터페이스의 유형으로 판단합니다. Mattermost는 운영 체제가 VPN 또는 터널 어댑터로 보고하는 인터페이스를 찾습니다. macOS와 iOS에서는 utun 및 ipsec 인터페이스, Windows에서는 유형이나 이름으로 VPN 또는 터널 장치임을 식별할 수 있는 어댑터가 여기에 해당합니다. 여기에는 다음과 같은 한계가 있습니다.
- 스플릿 터널 VPN은 Mattermost로 향하는 트래픽이 터널을 통과하지 않는 경우에도 활성 상태로 보고되거나, 클라이언트가 인터페이스를 프로비저닝하는 방식에 따라 전혀 보고되지 않을 수 있습니다.
- 인식할 수 있는 터널 인터페이스를 제공하지 않는 비표준 VPN 구현은 감지되지 않습니다.
vpn_active는 터널 인터페이스가 존재한다는 사실만 알려 주며 Mattermost 연결이 해당 인터페이스를 사용한다는 뜻은 아닙니다. 요청이 사용자의 네트워크에서 온다는 점을 강제하려면 VPN 게이트웨이가 제공하는 범위에 대해 ip_address에 inCIDR 검사를 사용하고, vpn_active는 보조 신호로 취급하세요.
세션 속성 참조#
System Console의 세션 속성 목록에는 각 속성의 이름, 유형, 지원 플랫폼, TTL, 유예 기간, 상태가 표시됩니다. 서버로 표시된 속성은 클라이언트가 보고하는 것이 아니라 Mattermost 서버가 측정합니다.
| 속성 | 설명 | 플랫폼 | 수집 방식 | 기본 TTL / 유예 기간 |
|---|---|---|---|---|
ip_address |
서버가 측정한, 요청이 도착한 IP 주소입니다. 예: 203.0.113.42. |
데스크톱, 모바일, 브라우저 | 요청 연결에서 읽으며, ServiceSettings.TrustedProxyIPHeader가 구성된 경우 해당 설정에서 읽습니다. 신뢰할 수 있는 프록시 헤더와 inCIDR 규칙을 참조하세요. |
해당 없음 |
user_agent_platform |
하드웨어 플랫폼입니다. Windows, Macintosh, Linux, iPad, iPhone, iPod, BlackBerry, Windows Phone, Unknown 중 하나입니다. |
데스크톱, 모바일, 브라우저 | User-Agent 헤더에서 구문 분석합니다. |
해당 없음 |
user_agent_os |
운영 체제입니다. Windows, Windows 10, Windows 8.1, Windows 8, Windows 7, Windows Vista, Windows XP x64 Edition, Windows XP, Windows 2000, Windows Phone, Mac OS, iOS, Android, Chrome OS, Linux, BlackBerry, Kindle, webOS, Unknown 중 하나입니다. |
데스크톱, 모바일, 브라우저 | User-Agent 헤더에서 구문 분석합니다. |
해당 없음 |
user_agent_browser_name |
클라이언트 이름입니다. Chrome, Firefox, Safari, Edge, Internet Explorer, Opera, Android, BlackBerry, Desktop App, Mobile App, mmctl, Unknown 중 하나입니다. |
데스크톱, 모바일, 브라우저 | User-Agent 헤더에서 구문 분석합니다. |
해당 없음 |
user_agent_browser_version |
브라우저 또는 Mattermost 클라이언트의 버전입니다. 예: 130.0.6723. |
데스크톱, 모바일, 브라우저 | User-Agent 헤더에서 구문 분석합니다. |
해당 없음 |
client_ip_address |
기기가 인식하는, 기기 자체의 기본 네트워크 인터페이스 IP 주소입니다. 예: 10.0.12.34. 사용자가 NAT 또는 프록시 뒤에 있으면 ip_address와 다릅니다. |
데스크톱, 모바일 | 네이티브 OS API를 사용해 기본 네트워크 인터페이스에서 읽습니다. 가능하면 IPv4를 사용하며, IPv4 주소가 없으면 클라이언트가 IPv6로 대체합니다. | 15s / 15s |
network_interface_type |
기기의 기본 네트워크 인터페이스 유형입니다. wifi, ethernet, cellular, vpn, other 중 하나입니다. |
데스크톱, 모바일 | macOS: SCNetworkInterface 인터페이스 유형. Windows: IP Helper 어댑터 유형. iOS: NWPathMonitor. Android: NetworkCapabilities 전송 유형. |
15s / 15s |
vpn_active |
기기에서 VPN 또는 터널 인터페이스가 활성 상태인지 여부입니다. true 또는 false입니다. |
데스크톱, 모바일 | 기기의 네트워크 인터페이스에서 알려진 VPN 및 터널 어댑터 유형을 검사하여 감지합니다. 정확도의 한계는 VPN 감지를 참조하세요. | 15s / 15s |
ssid |
기기가 연결된 Wi-Fi 네트워크의 이름입니다. 기기가 Wi-Fi에 연결되어 있지 않으면 비어 있습니다. | 데스크톱, 모바일 | Windows: WLAN API. iOS와 Android: 사용자가 위치 접근 권한을 부여해야 하는 플랫폼 Wi-Fi API. macOS 데스크톱에서는 수집되지 않습니다. | 15s / 15s |
mdm_enrolled |
기기가 모바일 기기 관리(MDM)에 등록되어 있는지 여부입니다. true 또는 false입니다. |
데스크톱, 모바일 | Windows: MDM 등록 레지스트리 항목의 존재 여부. iOS: 관리되는 앱 구성. Android: 관리 프로필 또는 관리되는 앱 제한. macOS 데스크톱에서는 항상 false로 보고합니다. |
60s / 60s |
jailbreak_detected |
모바일 기기가 탈옥 또는 루팅된 것으로 보이는지 여부입니다. true 또는 false입니다. |
모바일 | 모바일 OS 연동에서 제공하는 루팅 및 탈옥 휴리스틱입니다. | 60s / 60s |
os_platform |
기기의 운영 체제 계열입니다. macos, windows, linux, ios, android 중 하나입니다. |
데스크톱, 모바일 | 클라이언트가 Electron 또는 React Native API를 사용해 직접 보고합니다. | 60s / 60s |
os_version |
기기의 운영 체제 버전입니다. 예: 15.3.1 또는 10.0.22631. |
데스크톱, 모바일 | 클라이언트가 Electron 또는 React Native API를 사용해 직접 보고합니다. | 60s / 60s |
client_version |
Mattermost Desktop App 또는 모바일 앱의 버전입니다. 예: 6.3.0. |
데스크톱, 모바일 | 클라이언트가 Electron 또는 React Native API를 사용해 직접 보고합니다. | 60s / 60s |
hardware_id |
기기의 안정적인 하드웨어 식별자입니다. | 데스크톱 | macOS: IOPlatformUUID. Windows: SMBIOS 시스템 UUID. |
300s / 300s |
client_device_id |
모바일 기기용 공급업체별, 설치별 기기 식별자입니다. | 모바일 | iOS: identifierForVendor. Android: ANDROID_ID. |
300s / 300s |
tls_device_id |
리버스 프록시가 확인하는 기기 ID이며, 일반적으로 클라이언트 TLS 인증서에서 파생됩니다. | 데스크톱, 브라우저 | X-Mattermost-Session-Attribute-Device-Id 헤더에서 읽으며, TrustProxyDeviceIdentityHeader가 활성화된 경우에만 읽습니다. 해당 헤더를 설정할 수 있는 호출자는 누구나 이 값을 설정할 수 있으므로, 클라이언트가 프록시를 우회할 수 없는 경우에만 신뢰할 수 있습니다. 프록시 기기 ID 헤더 신뢰를 참조하세요. |
300s / 300s |
server_fqdn |
클라이언트가 연결된 Mattermost 서버의 호스트 이름입니다. 클라이언트가 여러 서버에 연결할 때 유용합니다. | 데스크톱, 모바일 | 클라이언트가 구성된 서버 URL에서 파생합니다. | 300s / 300s |
client_fqdn |
기기 자체의 정규화된 도메인 이름(FQDN)입니다. | 데스크톱 | macOS: 로컬 호스트 이름과 기본 DNS 검색 도메인의 조합. Windows: GetComputerNameExW. |
300s / 300s |
구성 설정#
두 설정 모두 System Console > System Attributes > Attribute-Based Access에서 관리하며 기본적으로 비활성화되어 있습니다.
프록시 기기 ID 헤더 신뢰#
X-Mattermost-Session-Attribute-Device-Id 요청 헤더에서 tls_device_id 세션 속성을 채웁니다. 이를 통해 상호 TLS를 수행하는 리버스 프록시가 클라이언트 스스로는 위조할 수 없는 기기 ID를 확인할 수 있습니다.
config.json설정:"AccessControlSettings.TrustProxyDeviceIdentityHeader": false이며 옵션은true와false입니다.- 환경 변수:
MM_ACCESSCONTROLSETTINGS_TRUSTPROXYDEVICEIDENTITYHEADER
사용자가 제어하는 리버스 프록시가 Mattermost로 향하는 모든 연결을 종료하고 동시에 인바운드 요청의 X-Mattermost-Session-Attribute-Device-Id를 제거하거나 덮어쓸 때만 이 설정을 활성화하세요. 클라이언트가 Mattermost 서버에 직접 접근할 수 있거나 프록시가 헤더를 수정하지 않고 그대로 전달하면, 모든 클라이언트가 임의의 기기 ID를 확인한 것처럼 보이게 하여 tls_device_id로 제한하는 정책을 충족시킬 수 있습니다.
기기 ID 일관성 적용#
세션에서 보고된 기기 ID가 세션 도중 변경되면 해당 세션을 취소합니다. Mattermost는 tls_device_id, client_device_id, hardware_id를 세션에 대해 이전에 캐시된 값과 비교합니다. 이 중 하나라도 변경되면 세션이 취소되고, 사용자는 다시 로그인해야 하며, 취소 사실이 감사 로그에 기록됩니다. 비활성화하면 변경된 기기 ID가 세션을 취소하지 않고 캐시된 값을 덮어씁니다.
config.json설정:"AccessControlSettings.EnforceDeviceIDConsistency": false이며 옵션은true와false입니다.- 환경 변수:
MM_ACCESSCONTROLSETTINGS_ENFORCEDEVICEIDCONSISTENCY
이 설정은 세션 토큰 탈취를 완화합니다. 탈취된 토큰을 다른 식별자를 보고하는 기기에서 재사용하면 해당 세션이 취소됩니다. 기기 식별자를 보고하지 않는 재사용이나, 식별자를 캐시한 적이 없는 세션에서의 재사용은 취소되지 않습니다. tls_device_id는 프록시 기기 ID 헤더 신뢰가 활성화된 경우에만 존재하며, 나머지 두 식별자는 플랫폼 지원 여부에 따라 달라집니다. 사용 중인 전체 기기에서 의존하려는 식별자가 안정적인 값을 보고하는 것을 확인한 후에 이 설정을 활성화하세요. 정당하게 변경되는 식별자가 있으면 사용자가 로그아웃되기 때문입니다.
문제 해결 및 FAQ#
속성이 올바르게 보이는데 사용자가 접근을 거부당하는 이유는 무엇입니까?#
다음 항목을 순서대로 확인하세요.
- 클라이언트를 확인합니다. 세션 속성 참조의 플랫폼 칼럼을 사용하여 사용자가 해당 속성을 보고할 수 있는 클라이언트를 사용하고 있는지 확인합니다.
- 속성이 활성화되어 있는지 확인합니다. System Console > System Attributes > Session Attributes에서 확인합니다.
- 값의 대소문자를 확인합니다.
ssid와 같은 자유 텍스트 값은 클라이언트가 보고하는 값과 정확히 일치해야 합니다. - 최신 상태인지 확인합니다. 새 보고 없이 TTL과 유예 기간이 지났다면 해당 속성은 없는 것으로 처리됩니다.
- 사용자의 Desktop App 설정을 확인합니다. 설정 > 고급 > 세션 속성 활성화가 선택 해제되어 있으면 클라이언트는 아무것도 보고하지 않습니다. 활성화되어 있으면 그 아래 표에 앱이 각 속성에 대해 현재 보고하는 값이 표시되므로, 문제가 클라이언트에 있는지 서버에 있는지 알 수 있습니다.
ssid의 위치 권한을 확인합니다. 모바일 기기는 사용자가 위치 접근 권한을 부여한 경우에만 Wi-Fi 네트워크 이름을 보고합니다.
사용자가 세션 속성을 위조할 수 있습니까?#
클라이언트가 보고하는 속성은 자체 증명이므로 암호학적 증거가 아니라 보안 상태 신호로 취급하세요. Mattermost는 노출을 다음과 같이 제한합니다. 서버에서 파생된 속성은 클라이언트가 보낸 값을 받아들이지 않고 요청에서 측정합니다. tls_device_id는 신뢰할 수 있는 프록시에서만 받아들입니다. 들어오는 값은 알 수 없거나, 비활성화되었거나, 요청한 플랫폼에서 유효하지 않으면 폐기됩니다. 기기 ID 일관성 적용은 기기 ID가 변경된 세션을 취소합니다.
자체 증명에 의존해서는 안 되는 제어에는 ip_address와 inCIDR을 함께 사용하거나, 프록시의 상호 TLS가 뒷받침하는 tls_device_id를 사용하세요. 두 방식 모두 프록시가 올바르게 구성되어 있어야 합니다. 신뢰할 수 있는 프록시 헤더와 inCIDR 규칙과 프록시 기기 ID 헤더 신뢰를 참조하세요.
봇, 개인 액세스 토큰, 연동에서도 세션 속성이 수집됩니까?#
아니요. 수집은 대화형 최종 사용자 세션으로 제한됩니다. 개인 액세스 토큰 세션, OAuth 앱 세션, 로컬 모드 세션, 원격 클러스터 토큰은 서버에서 파생된 속성을 포함해 아무것도 수집하지 않습니다. 세션 속성을 참조하는 정책은 이러한 호출자를 거부합니다.
고가용성 클러스터에서도 세션 속성이 작동합니까?#
예. 속성 업데이트는 고가용성 클러스터의 모든 노드에 브로드캐스트되므로 모든 노드가 같은 세션 정보를 기준으로 정책을 평가합니다.
직접 세션 속성을 추가할 수 있습니까?#
아니요. 세션 속성의 집합은 고정되어 있습니다. 기본 제공 속성을 활성화하거나 비활성화하고 TTL과 유예 기간을 조정할 수 있지만, 속성을 추가하거나 이름을 바꾸거나 제거할 수 없으며 유형이나 지원 플랫폼도 변경할 수 없습니다. 조직별 값에는 사용자 속성을 대신 사용하세요.