[android 보안] 사용자 관리 #1 |
출처 : Android Security Internals 4장
개요 목차
4. 사용자 관리
4.1. 다중 사용자 지원 개요
4.2. 사용자 종류
4.2.1. 주 사용자(소유자)
4.2.2. 보조 사용자
4.2.3. 제한된 프로필
4.2.4. 게스트 사용자
4.3. 사용자 관리
4.3.1. 명령행 도구
4.3.2. 사용자 상태 및 관련된 브로드캐스트
4.4. 사용자 메타 데이터
4.4.1. 사용자 리스트 파일
4.4.2. 사용자 메타데이터 파일
4.4.3. 사용자 시스템 디렉터리
4.5. 사용자별 앱 관리
4.5.1. 앱 데이터 디렉터리
4.5.2. 앱 공유
4.6. 외부 저장소
4.6.1. 외부 저장소 구현
4.6.2. 다중 사용자 외부 저장소
4.6.3. 외부 저장소 권한
4.7. 그 외 다중 사용자 기능
4.8. 요약
4.1. 다중 사용자 지원 개요
-
안드로이드 4.2 ( Jelly Bean ) 에 다중 사용자 지원이 추가되었다.
-
사용자는 고유한 사용자 ID (리눅스 UID와는 다르다) 로 식별되며 시스템만 사용자 간에 전환할 수 있다.
( 안드로이드에서 사용자 ID 는 기본 사용자의 경우 0번, 보조 사용자의 경우 10번 이후의 번호가 할당된다. )
일반적으로 사용자는 안드로이드 잠금 화면에서 사용자를 선택해 전환할 수 있으며, 이때 부가적으로 패턴, PIN, 패스워드 등을 이용해 인증한다.
앱은 UserManager API 를 통해 현재 사용자에 대한 정보를 가져올 수 있지만, 일반적으로 다중 사용자 환경을 지원하기 위해 코드를 수정해야 하는 경우는 거의 없다.
-
기본적으로 한 명의 사용자만 허용하도록 설정되어 있어서 사실상 다중 사용자 지원이 비활성화되어 있다.
다중 사용자 지원을 활성화하려면 일반적으로 디바이스에 맞는 오버레이(Overlay) 환경 설정 파일을 추가해 config_multiuserMaximumUsers 시스템 리소스의 값을 1보다 큰 값으로 설정해야 한다.
예를 들어 넥서스 7 기준 오버레이 설정이 device/asus/flo/overlay/frameworkds/base/core/res/res/values/config.xml 파일 안에 정의되어 있다.
-
안드로이드 호환성 정의(Android Compatibility Definition)에 따르면 “아직까지 다중 사용자 디바이스에서 전화 API 의 작동이 정의되어 있지 않기 때문에 전화를 지원하는 디바이스는 다중 사용자를 지원하면 안 된다. 따라서 현재 프로덕션 빌드를 설치한 핸드셋은 모두 단일 사용자 디바이스로 설정된다.
4.2. 사용자 종류
* 4.2.1. 주 사용자(소유자)
-
주 사용자의 사용자 ID 는 0이다.
-
주 사용자는 모든 권한을 갖고 있으며, 사용자를 생성 및 삭제할 수 있을 뿐만 아니라 디바이스 보안, 네트워크 연결, 앱 관리에 관련된 설정 등 모든 사용자에 미칠 수 있는 시스템 설정을 변경할 수 있다.
설정 화면에 나오는 디바이스 및 사용자 관리 화면은 주 사용자에게만 보여주고 나머지 사용자에게는 보여주지 않으므로, 주 사용자만 디바이스와 사용자를 관리할 수 있다.
-
안드로이드 버전 4.4( Kitkat ) 부터 시스템 설정의 무선 및 네트워크 섹션에서 다음 화면은 주 사용자만 볼 수 있다.
셀 브로드캐스트
모바일 요금제 관리
모바일 네트워크
테더링 및 이동식 핫스팟
VPN
WiMAX (지원되는 기기에서만 볼 수 있음 )
보안 섹션에서 다음 화면은 주 사용자만 볼 수 있다.
디바이스 암호화
SIM 카드 락
알 수 없는 출처
앱 검증
* 4.2.2. 보조 사용자
-
각 사용자는 자신의 전용 디렉터리, 고유한 설치 앱 목록, 그리고 설치된 앱에 대한 비공개 데이터 디렉터리를 갖는다.
-
보조 사용자는 사용자를 추가하거나 관리할 수 없으며, 사용자 화면을 통해 자신의 사용자명만 바꿀 수 있다.
그리고 앞서 나열한 주 사용자만 실행할 수 있는 작업은 수행할 수 없다.
-
비록 제한되어 있기는 하지만 보조 사용자도 디바이스 작동 및 다른 사용자에게 영향을 줄 수 있다.
예를 들어 새로운 와이파이 네트워크에 연결할 수 있다.
와이파이 연결 상태는 시스템 전체에 공유되므로 다른 사용자로 전환해도 무선 연결을 다시 설정하지 않으며, 전환된 사용자는 기존 사용자가 선택한 무선 네트워크에 연결된다.
-
앱 패키지는 모든 사용자가 공유하므로 새로운 권한을 추가하는 앱을 보조 사용자가 업데이트하면
다른 사용자의 동의 없이도 앱에 권한이 부여되며, 권한 변경이 다른 사용자에게 통지되지 않는다.
* 4.2.3. 제한된 프로필
-
보조 사용자와 달리 제한된 프로필(안드로이드 4.3, JB MR1 에 추가되었다.)은 주 사용자에 기반을 두고 있으며, 어떤 제한과 함께 앱, 데이터, 계정을 공유한다.
그렇기 때문에 주 사용자는 자신의 데이터를 보호하기 위해 잠금 화면 패스워드를 설정해야 한다.
** 사용자 제한
-
사용자가 할 수 있는 작업을 제한하기 위해 안드로이드는 다음과 같은 제한을 기본적으로 정의한다.
모든 제한은 기본값이 false 이다.
DISALLOW_CONFIG_BLUETOOTH
DISALLOW_CONFIG_CREDENTIALS
DISALLOW_CONFIG_WIFI
DISALLOW_INSTALL_APPS
DISALLOW_INSTALL_UNKNOWN_SOURCES
DISALLOW_UNINSTALL_APPS
DISALLOW_MODIFY_ACCOUNTS
DISALLOW_REMOVE_USERS
DISALLOW_SHARE_LOCATION
DISALLOW_USB_FILE_TRANSFER
** 제한의 적용
-
실행 시 앱은 UserManager.getUserRestrictions() 메서드를 이용해 사용자에게 부과된 제한을 담고 있는 번들(Bundle, 문자열 키에 다양한 형태의 값이 대응된 범용 컨테이너 클래스)을 가져올 수 있다.
제한은 키-값 쌍으로 정의되어 있으며, 키에는 제한명, 값에는 불린형 값이 들어 있다.
여기서 불린형 값은 이 제한이 적용되는지의 여부를 나타낸다.
앱에서는 이 값을 시용해 제한된 프로필로 실행될 때 기능 일부를 비활성화할 수 있다.
-
주 사용자는 제한된 프로필이 어느 앱을 사용할 수 있는지 선택할 수 있다.
제한된 프로필을 생성할 때 처음에는 모든 앱이 비활성화되어 있으므로, 디바이스 소유자는 제한된 프로필이 사용할 앱을 명시적으로 활성화해야 한다.
-
실행 시 앱은 UserManager.getApplicationRestrictions() 메서드를 이용해 저장된 제한을 키-값 쌍으로 담고 있는 번들을 가져올 수 있다.
그런 다음 적용된 제한에 따라 어떤 기능을 비활성화하거나 수정할 수 있다.
** 온라인 계정에 접근
-
제한된 프로필은 계정 관리자 API 를 통해 주 사용자의 온라인 계정에 접근할 수도 있지만, 이 접근은 기본적으로 비활성화되어 있다.
제한된 프로필로 실행될 때 계정에 접근해야 하는 앱은 manifest <application> 태그의 restrictedAccountType 속성을 이용해 자신이 필요로 하는 계정의 종류를 명시적으로 선언해야 한다.
ex)
<application android:restrictedAccountType=“com.google"
...
/>
-
한편, 계정 정보를 제한된 프로필에 노출하지 않으려는 앱은 manifest <application> 태그의 requiredAccountType 속성값에 계정 종류( * 는 모든 계정 종류에 대응 ) 를 지정해 계정 정보를 노출시키지 않을 수 있다.
안드로이드는 requiredAccountType 속성이 지정된 앱을 제한된 프로필에게는 자동으로 비활성화시킨다.
* 4.2.4. 게스트 사용자
-
안드로이드는 단 한 명의 게스트 사용자를 지원하며, 이 기능은 기본적으로 비활성화되어 있다.
UserManager.getGuestEnabled() 메서드를 호출해 게스트 사용자를 활성화할 수 있지만, 현재의 안드로이드 버전에서는 UserManager 및 관련된 클래스 외에는 어디에서도 이 메서드를 참조하지 않는다.
4.3. 사용자 관리
-
안드로이드 사용자는 유저 매니저 서비스(UserManagerService)가 관리하는데, 이 서비스는 사용자 정보를 읽고 영구 보존하며 활성화된 사용자 목록을 관리한다.
사용자 관리는 패키지 관리와 밀접한 관련이 있기 때문에 패키지가 설치되거나 제거될 때 사용자에 대한 정보를 얻거나 수정하기 위해 패키지 매니저 서비스가 유저 매니저 서비스를 호출한다.
-
앱은 특별한 권한이 없어도 패키지에 대한 권한 목록뿐만 아니라 시스템에 있는 사용자 수, 사용자의 일련번호, 현재 사용자명 및 제한 목록을 가져올 수 있다.
이외 사용자의 정보를 조회하거나 사용자를 추가, 삭제, 수정하려면 시스템 signature 보호 수준의 MANAGE_USERS 권한이 필요하다.
* 4.3.1. 명령행 도구
-
사용자 관리 작업은 안드로이드 셸에서 pm 명령으로 처리할 수도 있다.
이 명령은 루트 권한이 없는 셸에서도 수행할 수 있는데, 이는 셸 사용자(UID 2000)에게 MANAGE_USERS 권한이 부여되어 있기 때문이다.
사용자를 생성하려면 pm create-user 명령을, 사용자를 제거하려면 pm remove-user 명령을 사용한다.
pm get-max-users 명령은 OS가 지원하는 최대 사용자 수를 가져오고, pm list users 명령은 사용자를 모두 나열한다.
pm list users 안의 중괄호 안 내용은 순서대로 사용자 ID, 사용자명, 플래그 이다.
* 4.3.2. 사용자 상태 및 관련된 브로드캐스트
-
사용자가 추가되면 USER_ADDED, 사용자가 제거되면 USER_REMOVED, 사용자명이나 사용자 프로필 아이콘이 변경되면 USER_INFO_CHANGED 브로드케스트를 보낸다.
-
사용자를 전환하면 USER_BACKGROUND, USER_FOREGROUND, USER_SWITCHED 브로드캐스트 메시지를 보내는데, 이 메시지에는 관련된 사용자 ID 정보가 추가로 들어간다.
-
안드로이드가 최대 8명의 사용자를 지원하지만, 한 번에 최대 3명의 사용자만 동시에 실행될 수 있다.
잠금 화면에서 어떤 사용자로 전환하면 그 사용자가 실행된다.
안드로이드는 가장 오랫동안 사용하지 않은 (Least Recently Used, LRU) 사용자 캐시 알고리즘에 기반을 두고 비활성화된 사용자의 실행을 종료하므로 한 번에 최대 3명의 사용자만 활성화되도록 보장한다.
-
사용자의 실행이 종료되면 그 사용자의 프로세스는 종료되고 더 이상 브로드캐스트 메시지를 받지 못한다.
사용자가 실행되거나 종료되면 시스템은 USER_STARTING, USER_STARTED, USER_STOPPING, USER_STOPPED 브로드케스트 메시지를 보낸다.
주 사용자는 시스템이 부팅될 때 자동으로 실행되며 결코 종료되지 않는다.
-
사용자를 실행, 종료, 전환하거나 특정 사용자에게 브로드캐스트 메시지를 보내려면 INTERACT_ACROSS_USERS 권한이 필요하다.
이 권한은 signature 보호 수준의 시스템 권한이지만 development 플래그가 설정되어 있으므로 pm grant 명령을 이용해 이 권한을 선언한 비시스템 앱에 동적으로 권한을 부여할 수 있다.
signature 보호 수준의 INTERACT_ACROSS_USERS_FULL 권한은 모든 사용자에게 브로드캐스트 메시지를 보내 디바이스 관리자를 변경할 수 있을 뿐만 아니라, 모든 사용자에게 영향을 미치는 높은 권한의 작업도 수행할 수 있게 해준다.
다음 글 : [android 보안] 사용자 관리 #2
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] Framework 혹은 3rd-party lib 이 뿜는 Exception 을 피해보자 ( ex) NullPointerException at acm.a ) (0) | 2018.04.22 |
---|---|
[android 보안] 사용자 관리 #2 (0) | 2018.04.21 |
[android 보안] 패키지 관리 #2 (0) | 2018.04.19 |
[android 보안] 패키지 관리 #1 (0) | 2018.04.18 |
[android 보안] 권한 #2 (0) | 2018.04.17 |
댓글