Device API Access Control – attribute of subject element

03/10/2010

1. Introduction

이번에는  device API에 접근을 위해 접근을 요청한 widget이 API에
접근이 가능한 widget인지를 확인에 이용되는 subject element와
attribute 에 대해서 알아보도록 하겠습니다.

이 subject element 는 API에 접근이 가능한 widget 혹은 접근이
불가능한 widget을 구분하여 API에 접근하는 것을 제어할 수
있습니다. 일반 휴대전화에도 있는 white list/black list 라고
생각하면 더 이해하기 쉬울 것 같습니다.

그럼 이제부터 subject element 에 대해서 알아보도록 하겠습니다.

2. Subject element

이 subject element 는 BONDI에서 정의한 XML format 에 포함되는
element 로 widget 하나 혹은 여러 widget을 묶음으로 관리하기 위한
element 입니다.  이 element 는 subject-match라는 child element 를
가지고 있고, subject-match에 widget을 분류하는 attribute 들이
있습니다. 그럼 widget을 분류 하기위한 attribute가 어떠한 것이
있는지 알아보도록 하겠습니다.

ATTRIBUTE TYPE VALUE
class String 요청을 한 App이 widget 인지 website 인지 구분
install-uri  URI  해당 widget을 설치한 URI
id  URI  config.xml 에 정의 되어 잇는 widget id
version  string  widget 의 version
distributor-key-cn  string  widget 공급자 서명을 위한 인증서의 common name
distributor-key -fingerprint string  widget 공급자 서명을 위한 인증서의 지문정보
distributor-key-root-cn  string  widget 공급자 서명을 위한 root 인증서의 common name
distributor-key-root-fingerprint  string  widget 공급자 서명을 위한 root 인증서의 지문정보
author-key-cn  string  widget 저자 서명을 위한 인증서의 common name
author-key -fingerprint  string  widget 저자 서명을 위한 인증서의 지문정보
author-key-root-cn  string  widget 저자 서명을 위한 root 인증서의 common name
author-key-root-fingerprint string widget 저자 서명을 위한 root 인증서의 지문정보
widget-attr:name   config.xml 에 정의 되어 잇는 widget name

 위의 표와 같이 여러가지의 attribute 들이 정의 되어 있습니다.
각 subject-match는 위의 attribute 를 하나씩 포함을 하고 있으며
여러개의 subject-match를 포함하고 있는 subject element 는
포함된 subject-match의 value 가 모두 TRUE 이어야만
subject 가 TRUE가 됩니다.

이렇게 하여 사업자, 제조사 그리고 사용자가 원하는 widget에게
필요한 만큼만 resource 를 open 함으로 악의적의 공격으로 부터
device 를 보호할 수 있게 됩니다.

3. Opinion

이번에는 subject에 관련된 것들을 알아보았습니다. 이 보안은
몇 번을 강조해도 지나치지 않다고 생각하는데요. 특히, widget
website에서도 device 의 resource 에 접근이 가능해지면서
보안은 더 중요시 되고 있는 것 같습니다. PC에도 중요한 정보가
많이 있겠지만 mobile device 의 경우는 많은 사람의 연락처 등
PC 못지 않게 혹은 PC보다 더 중요하고 많은 개인정보를 담고
있습니다. 보안 관련 솔루션을 개발하는 개발자들이 아무리
잘만들더라도 개인이 소홀이 할 경우 중요한 개인 정보는
해커들의 손에 넘어가게 되어 있습니다. 언제나 보안을 신경쓰는
습관을 들이는 것이 최고의 보안이 아닐까 생각합니다.
그럼 다음에 또 뵙겠습니다.

Reference

http://bondi.omtp.org/1.1/security/BONDI_Architecture_and_Security_Appendices_v1.1.pdf


Prompt-x

02/24/2010

1. Introduction

BONDI 는 API 들을 정의하고, 이 API에 접근을 요청하는 Widget 의 접근을
제어하여 악의적인 요청으로 부터 device 를 보호하고 있습니다.

현재 BONDI는 XACML (eXtensible Access Control Markup Language )을
기반으로 compact 한 XML format 을 이용하여 API에 대한 접근을 제어하고
있습니다.
( 참고 : http://bondi.omtp.org/1.1/security/bondixml.rnc.txt - DTD)

이 포스트에서는 복잡한 알고리즘 보다는 실제 접근 제어에 사용되는
efftect value 인 Prompt-x에 대해서 알아보기로 하겠습니다.

2. Prompt-x

effect 에 들어갈 수 있는 value 는 총 5가지가 있다. 그 value 는 다음과 같습니다

  • permit – This effect allows requested access without user interaction.
  • deny – This effect denies requested access without user interaction.
  • prompt-oneshot – This effect allow requested access after explicit confirmation by the user.
  • prompt-session – This effect allow requested access after explicit confirmation by the user.
  • prompt-blanket – This effect allow requested access after explicit confirmation by the user.

이 중 permit과 deny는 별다른 user interaction이 없는 value 이므로
별다른 혼란이 없이 사용되어 집니다.  하지만 prompt-x로 되어 있는 것들은
명백한 사용자의 확인에 의해서만 해당 API에 접근할 수 있는 value입니다.

prompt 의 경우 각 value별로 적용이 가능한 option을 보여주는 대화상자
(dialog)로 user와 interaction을 하게 됩니다. 이제 prompt 의 종류별로
어떠한 조건으로 user와 interaction 하는지 알아 보겠습니다.

2.1 prompt-oneshot

이 value의 spec을 먼저 보면 다음과 같습니다.
“deny always”, “deny this time”, “allow this time”
이 것은 user의 확인을 요하는 dialog에서 위와 같은 list를 주어
user 에게 해당 request 에 대한 확인을 요청하게 됩니다.
그 후 user는 위에 정해진 값 중 한가지를 선택하여 request에 대한
제어를 하게 됩니다.

(prompt-oneshot의 범위 : 해당 API에 대한 요청에 단 한 번만 유효함
                                      이후 동일 API에 대한 요청이 있으면 다시
                                       user의 확인 후 API 접근 가능.
                                      -단, deny always의 경우 WRT engine이 종료 
                                       될 때까지 유지)

2.2 prompt-session

이 value의 spec을 먼저 보면 다음과 같습니다.
prompt-oneshot options plus “deny for this session”,
“allow for this session” 이 것은 prompt-oneshot 에 있는
option에 다음과 같은 ”deny for this session”,
“allow for this session” list를 추가하여 user의 확인을
요하는 dialog를 띄워 user 에게 해당 request 에 대한
확인을 요청하게 됩니다. 그 후 user는 위에 정해진 값 중
한가지를 선택하여 request에 대한 제어를 하게 됩니다.

(prompt-session 의 범위 : widget application이 실행되어 있는 상태)

2.3 prompt-blanket

이 value의 spec을 먼저 보면 다음과 같습니다.
prompt-session options plus “allow always”.
이 것은 prompt-session 에 있는 option에 다음과 같은 ”allow always” 
list를 추가하여 user의 확인을 요하는 dialog를 띄워 user 에게 해당
request 에 대한 확인을 요청하게 됩니다.
그 후 user는 위에 정해진 값 중 한가지를 선택하여 request에 대한
제어를 하게 됩니다.

(prompt-blanket 의 범위 : WRT engine이 실행되어 있는 상태
                                        단, engine 이 static module 로 구동 될 경우
                                         terminal 이 off 되기 전까지)

3. Opinion

어떠한 보안도 100%로 안전하다고 볼 수는 없지만 현재 BONDI에서는 보안 문제에 상당히 많이 힘쓰고 있습니다. 처음에는 단순히 XML file에 접근제어 값을 넣어 제어하던 방식에서 현재는 signed policy document, provisioning 을 통한 policy update 등 많은 발전이 있었습니다. 그래도 부족한 점이 있겠지만 이렇게 계속 보안에 힘을 쏟는다면 그래도 사용자가 안전하다고 믿고 사용할 수 있는 product가 될 것이라 믿습니다. 마지막으로 제 포스트에 문제가 있으면 답글로 남겨 주시면 리뷰 후 정정 하도록 하겠습니다.

4. Reference

http://bondi.omtp.org/1.1/security/BONDI_Architecture_and_Security_Appendices_v1.1.pdf


The BONDI API Design Patterns – Version 1.1

02/22/2010

BONDI 1.1 api에 대해 알아보기 앞서, api를 좀 더 잘 이해하기 위해  The BONDI API Design Patterns – Version 1.1 에 대해 알아보겠습니다.

1. Introduction

BONDI는 API들를 정의하고, 이 BONDI interface들은 WebIDL과 Documentation(doxygen과 유사하게)로 기술되어 있습니다.

BONDI Module 은 BONDI interface들로 구성되어 있으며, 확장자가 “.widl”인 하나의 파일로 기술됩니다.

이 Module은 앞으로도 증가할 것이기 때문에, WebIDl과 Documentaion을 어떻게 구성해야하는지에 대한 rule을 정의할 필요가 있습니다.

본 문서에서는 이 Rule에 대해 정의하고 있습니다.

2. WebIDL patterns

BONDI API는 WebIDL (W3C’s interface definition language)으로 기술되어 있습니다.

2.1. Error Handling

WebIDL에서는 methods, getters 그리고 setters에서 exception 과 exception시 전달되는 object의 발생이 가능합니다.

WebIDL exception은 상속구조를 가질 수 없습니다.

하지만  BONDI module에서는 각 module 마다 자신의 error interface를 가질 수 있습니다.

그래서 BONDI에서 계층적 error를 지원하기 위해서는 BONDI error interface를 사용하여야 합니다.

  • BONDI WebIDL 은 Exception에 대해 정의하지 않는다.
  • BONDI WebIDL의 모든 error interface는 BONDI generic error interface에서 상속받는다. GenericError는 ECMAScript Error에서 상속받는다.
  • GenericError에서 상속받은 object interface는 BONDI의 함수,  attribute getter, attribute setter를 통하여 인스턴스화 될 수 있다.
  • Error object는 object의 prototype 및 constructor 그리고 GenericError object의 attribute인 “error code”에 의해 식별될 수 있어야 한다.
  • Security와 관련된 error interface는 SecurityError에서 상속받으며, SecurityError는 GenericError에서 상속받는다.
  • Error code 상수(constant)는
    • 대문자로 정의된다.
    • 접미사 “_ERROR”를 사용한다.
    • 단어는 “_”로 사용하여 구분된다.
    • DeviceAPIError interface 는 Common error code를 포함하며, GenericError에서 바로 상속받는다.
    • Module 에서 정의하는 error 상수는 0 부터 시작된다.
    • Common error code 는 10,000 – 19,999 구간에서 정의된다.
    • Security 관련 error 는 20,000 – 29,999 구간에서 정의된다.

WebIDL definition

interface Error {

        readonly attribute DOMString name;

        readonly attribute DOMString message;
};

interface GenericError : Error {

        readonly attribute unsigned short code;
};

interface DeviceAPIError : GenericError {

        const unsigned short UNKNOWN_ERROR           = 10000;

        const unsigned short INVALID_ARGUMENT_ERROR  = 10001;

        const unsigned short NOT_FOUND_ERROR         = 10002;

        const unsigned short PENDING_OPERATION_ERROR = 10003;

        const unsigned short IO_ERROR                = 10004;

        const unsigned short NOT_SUPPORTED_ERROR     = 10005;
};

interface SecurityError : GenericError {
        const unsigned short PERMISSION_DENIED_ERROR = 20000;
};

2.2. Asynchronicity

BONDI WebIDL에서 비동기 함수는

  • 최소 2개의 parameter를 갖는다. 첫 번째는 SuccessCallback interface에서 상속받는 함수이며, 두 번째는 ErrorCallback interface에서 상속받는 함수이다.
  • 비동기 함수는 에러를 발생시키지 않고, ErrorCallback를 통하여 에러를 전달한다.
  • PendingOperation object를 리턴한다. 리턴값이 null이라면 비동기 함수가 이미 호출되었음을 의미한다.
  • PendingOperation 은 object의 “cancel” 함수 호출을 통하여 비동기 함수의 실행을 취소할 수 있습니다.
  • 이 “cancel” 함수는
    • 동기 방식으로 동작한다.
    • 항상 성공적으로 수행된다.
    • 리턴값이 true 이면 이미 callback 함수가 호출되었음을 의미한다.
    • false이면 성공적으로 취소되었음을 의미한다.

WebIDL definition

[Callback] interface SuccessCallback {

        void onSuccess(in Object ob);

};

[Callback] interface ErrorCallback {

        void onError(in Error error);

};

interface PendingOperation {

        boolean cancel();

};

2.2.1. How to combine APIs with architecture and security principles?

BONDI API의 설계시 ” BONDI Architecture & Security”의 원칙을 반드시 만족시켜야 합니다.

“BONDI Architecture & Security” 률은 아래와 같다.

  • BONDI의 security policy를 따르는 함수는 비동기 방식으로 동작한다.
  • attribute는 security policy를 따르지 않는다.

2.3. Namespaces and interface structure

BONDI Module 은 BONDI interface들로 구성되어 있는데, 이 계층을 나타내기 위해 WebIDl의 “implements” keyword를 사용합니다.

예를들어

Window implements bondiObject;

으로 정의된 경우 bondi interface가 Window object의 property임을 나타냅니다.

module bondi {
	interface bondi {
		...
        PendingOperation requestFeature (in RequestFeatureSuccessCallback successCallback,
                in ErrorCallback errorCallback,
                in DOMString name)
            raises (DeviceAPIError, SecurityError);
		...
	};

	interface bondiObject {
		readonly attribute bondi bondi;
	};

	Window implements bondiObject;
};

module calendar {
	interface CalendarManager {
	...
	...
	};

	interface Calendar {
	...
	...
	};

	interface CalendarManagerObject {
		readonly attribute CalendarManager calendarManager;
	};
	bondi implements CalendarManagerObject;

};

2.4. Data records, supported property keys and filters

BONDI API는 data와 관련된 검색 연산을 수행합니다.

BONDI module과  interface는 검색시 통일된 방법으로 filter를 표현하고 있습니다.

ECMAScript는 object의 property를 동적으로 추가할 수 있는데, 이는 매우 유용한 확장 구조입니다..

반면 저장 가능한 object를 다루기는 어려워 집니다.

왜냐하면, 어떤 platform에서는 미리 정의된 property와 그 값에 대해서만 저장할 수 있기 때문입니다.

그래서 상호 운영성의 측면에서 최소한의 property set을 정의할 필요가 있습니다.

그 결과, 다음과 같은 범주로 property를 나누게 되었습니다.

  • interoperable data-carrying properties,
  • platform-specific data-carrying properties,
  • application-specific data-carrying properties,
  • administrative properties.

property를 이러한 범주로 나누기 위해서,

저장 가능한 정보를 담고 있는 property들은 접미사  ”Properties”가 붙는 interface로 구성되도록 하였습니다.

예를 들면, contact의 경우 다음과 같은 기본 interface를 갖도록 처음 설계되었습니다.

    interface Address {
        attribute DOMString country;
        attribute DOMString postalCode;
    };

    interface Contact {
        readonly attribute DOMString id;
        attribute DOMString name;
        attribute DOMString email;
        attribute Address address;
	};

contact interface의 property 중 name, email, address 는 contact의 정보를 담고 있습니다.

반면 id 는 contact 정보가 아닌 관리상의 정보를 담고 있으며 platform에서 값을 할당하기 때문에 읽기 전용 속성을 가지고 있습니다.

따라서 아래와 같이 property-set 을 나눌 수 있습니다.

    interface ContactProperties {
        attribute DOMString name;
        attribute DOMString email;
        attribute Address address;
	};
    interface Contact : ContactProperties {
        readonly attribute DOMString id;
	};
  • contact의 정보를 담고 있는 property는 ContactProperties interface로 구성한다.
  • Contact interface  ContactProperties interface로 부터 상속받는다.

“interoperable data-carrying properties”는 XXXProperties interfaces에 속하며 모든 platform에서 사용 및 저장 가능하도록 구현되어야 하는 필수 property-set 입니다.

“platform-specific data-carrying properties”는 특정 platform에서만 사용 가능한 property 입니다.

“application-specific data-carrying properties”는 특정 application 에서만 사용 가능한 property 입니다.

XXX (XXXProperties 와 구별하기 위해) interface는 filter object를 생성할 때 사용됩니다.

그리고 지원하지 않는 filter object의 property는 구현부에서 무시해야 합니다.

<filter object의 생성 Rule>

  • filter object는 XXX object의 JSON 형식으로 표현됩니다.
  • filter interface는
    • GenericFilter로 부터 상속받는다.
    • XXX interface를 기반으로 하는 XXXFilter interface는 반드시 존재해야 한다.
  • filter 연산의 결과 데이터는 아래 규칙에 의해 연산된다.
    • filter object에 property가 나열되지 않았다면, 해당 property 의 모든 값 그리고 전체 데이터가 대상임을 의미한다.
    • filter object에 포함된 property는 서로간에  SQL “AND”와 같은 연산방식으로 처리된다.
    • filter object가 null이라면, 전체 데이터를 반환한다.
    • 반환되는 result-set의 정렬 순서는 구현부에서 결정한다.

3. Architectural patterns

3.1. Versioning

BONDI interface는 앞으로도 계속 발전할 것이며, interface 들도 계속 수정도 될 것입니다.

앞으로 release될 버전은 method나 attribute가 추가되거나 삭제 또는 수정될 수 있습니다.

이 변경에 대처하기 위해 versioning model이 필요합니다.

BONDI API versioning은 API feature의 IRI 에 기반하여 정의되어 있습니다.

만약 feature의 기능이 변경되었다면, 새로운 IRI가 추가되어야 합니다.

3.2. API coverage by features

BONDI API는 사용자의 privacy 보호를 위해 security policy와 관련되어 있습니다.

몇 몇 API는 security 제한으로 접근이 되지 않을 수도 있고, 또 다른 API들은 해당 platform 이나 User Agent에서 유효하지 않을 수도 있습니다.

BONDI에서는 feature를 사용하여 API에 대한 접근 권한 제어를 하고 있습니다.

  • 먼저 접근하려는 API들의 feature를  configuration 문서 (또는 프로그램적인 방법으로) 에 기술한다.
  • 그리고 API의 접근요청이 오면, 접근에 대한 동의여부를 결정한다

이를 위해 모든 method, attribute, constant 는 적어도 하나의 feature에 속해야 합니다.

3.3. Feature-sets

Rich Web Application은 많은 BONDI API들를 사용합니다.

그리고 BONDI security model을 만족하기 위해 많은 feature를 configuration 문서 (또는 프로그램적인 방법으로)에 정의해야 합니다.

이는 Application 에 성능 저하를 줄 수 있으며, configuration 문서작성을 힘들게 합니다.

이를 해결하기 위해 BONDI에서는 feature-set을 정의합니다.

feature-set은 하나 이상의 feature를 포함하고 있습니다.

그리고 각 module은 적어도 하나 이상의 feature-set이 정의되어야 합니다.

festure-set은 module의 모든 feature를 포함할 수도 있습니다.


BONDI 1.1 최종릴리즈

02/12/2010

MWC 2010에 맞춰서 BONDI 1.1 버전이 릴리즈 되었네요.

1.01 버전이 나온지 6개월이 지났으며, 이번 1.1 버전이야 말로 진정한 1.0 같은 느낌이 드네요.

완전히 새로운 것은 없지만, API 들에 대한 보완작업이 일부 있었구요. Security 쪽도 일부 개선작업이 있었습니다.

W3C 위젯 스펙중 Packaging and Compliance 스펙을 지원하는 동시에, 거꾸로 BONDI 스펙의 일부를 W3C에 제출하기도 했습니다.

사실 제가 지난달 파리에서 1.1 스펙에 대한 최종 논의 미팅을 참석했었는데요. 그 때는 스펙에 대한 가이드라인을 제시할 만큼의 준비가 된 상태가 아니어서 많이 아쉬웠습니다. ㅠㅠ.

앞으로는 평상시에 꾸준히 준비해서, 깊이 있는 내용에 대해서도 공유할 수 있었으면 좋겠습니다.  그런데 아직 프로젝트 때문에 설 연휴 전인데도 외근을 나와있다는 -_-;

참고 : OMTP announces latest BONDI release 1.1 and new cross platform widgets


BONDI 1.5 스펙 미리 보기

02/10/2010

1.0 CR 부터 1.1AR 등 차근차근 설명드려야하는데,

오늘 BONDI 1.5 APIs 에 대한 Public Working Draft v1 이 나왔네요.

(물론,  첫 draft이니 부족한 것도 많고 추가될 것도 많을 것 입니다.)

어쨌든 최대한 빨리 소식을 전하고자,  어떤 내용이 있는지 살펴보았습니다.

아래와 같이 7개의 인터페이스가 있네요.

APDU

This module allows the communication between web application and a smart card by using the Application Protocol Data Units (APDUs). An APDU is a short message represented by bytes. APDU messages are either commands or responses. APDU protocol is defined by ISO 7816-4 and is described in the Java Card Development Kit documentation at http://java.sun.com/products/javacard/.

이 것을 이용하면, 위젯에서 심카드 정보를 이용할 수 있겠군요. 여러가지 활용방안이 예상되네요.

Bluetooth

This API provides access to the bluetooth functionality. This set of interfaces provides a framework for short range device and service discovery of other bluetooth devices. Once a service has been discovered it is then possible to connect to this service and exchange data.

블루투쓰는 굳이 말하지 않아도 잘 아실듯…

Crypto

The crypto API provides cryptographic functions like hashing, signature verification, encrypting and decrypting to allow exchanging data between a server and a BONDI client securely (encrypting/decrypting), protecting data integrity (one-way hashing) and verifying the authentity of data (digital signatures).

BONDI에서 중요하게 생각하는 Security를 위해서 꼭 필요한 녀석이죠. 활용방안에 대해서는 좀 더 스터디가 필요할듯 합니다.

DLNA

This API enables discovery of the DLNA devices in the local network, control of the devices. It shall/could be coupled with the Media Player API for local playback.

Digital Living Network Alliance 의 약자로 원래는 DHWG(Digital Home Working Group) 이었다.  DLNA를 지원하는 장치간에는 컨텐츠를 쉽게 공유할 수 있다는 것인데, 위젯에서 어떤식으로 활용할지 감이 잘 안오네요.

Server Push

This API provides functionality of OMA Push delivery to Web Applications running in the widget context, which includes; registration/deregistration of web applications with the Push enabler and delivery of Push content to the registered application(s).

Push까지 지원되면, 위젯의 시나리오가 획기적으로 변경될려나?

Sensor

Sensor API Sensors are classified by type. Sensor type names are defined Strings, and creation new type names must be centrally defined (by the owner of this API definition).

센서는 말 그대로 요즘 최고 활용도가 높은 것으로 왜 이제야 스펙에 포함되었을까 하는 생각이 드네요. 정말 반가운 녀석이군요!.

Telephony

This API provides access to core telephony functions, boht incoming and outgoing calls.

1.5에 소개된 나머지 인터페이스에 비해서 그다지 흥미롭지는 않네요. 하지만, 폰 메뉴가 없는 장치(그런게 있을까요? ㅎㅎ)에서는 위젯으로 직접 GUI를 구성하면 되겠네요.

여기까지 입니다.^^

응용 계층에서 대등한 응용 실체 간에 주고받는 데이터단위로 응용 프로토콜 제어 정보와 응용 계층 사용자 데이터를 포함한다.

팔로우

모든 새 글을 수신함으로 전달 받으세요.