본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android 보안] 사용자 관리 #1

by 돼지왕 왕돼지 2018. 4. 20.
반응형

[android 보안] 사용자 관리 #1


출처 : Android Security Internals 4장

android compatibility definition, application tag, broadcast 권힌, config_multiuserMaximumUsers, development 플래그, DISALLOW_CONFIG_BLUETOOTH, DISALLOW_CONFIG_CREDENTIALS, DISALLOW_CONFIG_WIFI, DISALLOW_INSTALL_APPS, DISALLOW_INSTALL_UNKNOWN_SOURCES, DISALLOW_MODIFY_ACCOUNTS, DISALLOW_REMOVE_USERS, DISALLOW_SHARE_LOCATION, DISALLOW_UNINSTALL_APPS, DISALLOW_USB_FILE_TRANSFER, INTERACT_ACROSS_USERS, INTERACT_ACROSS_USERS_FULL, jelly bean, LRU, lru user, MANAGE_USERS, manifest, pm create-user, pm get-max-users, pm grant, pm list users, pm remove-user, requiredAccountType, restrictedAccountType, Signature, usermanager, UserManager.getApplicationRestrictions, UserManager.getGuestEnabled, UserManager.getUserRestrictions, UserManagerService, USER_ADDED, USER_BACKGROUND, USER_FOREGROUND, USER_INFO_CHANGED, USER_REMOVED, USER_STARTED, USER_STARTING, USER_STOPPED, USER_STOPPING, USER_SWITCHED, [android 보안] 사용자 관리 #1, 게스트 사용자, 권한 변경, 권한 상태 공유, 기본 사용자 uid, 다중 사용자 전화 api, 다중 사용자 지원, 다중 사용자 활성화, 동적 권한 부여, 명령행 도구, 보조 사용자, 보조 사용자 uid, 사용자 ID, 사용자 관리, 사용자 상태 및 관련된 브로드캐스트, 사용자 생성 삭제, 사용자 종류, 소유자, 앱 데이터 계정 공유, 앱 패키지 공유, 와이파이 연결 상태 공유, 잠금 화면 사용자 선택, 제한된 프로필, 주 사용자, 주 사용자 기반, 최대 사용자 수, 최대 활성화 사용자 수, 패키지 매니저

개요 목차


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 권한은 모든 사용자에게 브로드캐스트 메시지를 보내 디바이스 관리자를 변경할 수 있을 뿐만 아니라, 모든 사용자에게 영향을 미치는 높은 권한의 작업도 수행할 수 있게 해준다.





반응형

댓글