2.2. 역할 기반 액세스 제어
초록
이 섹션에서는 Karaf 컨테이너에서 기본적으로 활성화되어 있는 RBAC(역할 기반 액세스 제어) 기능에 대해 설명합니다. 표준 역할(예: 관리자 또는
) 중 하나를 사용자의 자격 증명에 추가하여 RBAC 기능을 즉시 활용할 수 있습니다. 고급 용도의 경우 각 역할이 수행할 수 있는 작업을 정확하게 제어하기 위해 액세스 제어 목록을 사용자 지정할 수 있는 옵션이 있습니다. 마지막으로 사용자 정의 ACL을 자체 OSGi 서비스에 적용하는 옵션이 있습니다.
관리자
2.2.1. 역할 기반 액세스 제어 개요
기본적으로 Fuse 역할 기반 액세스 제어는 Fuse 관리 콘솔, Cryostat 연결 및 Karaf 명령 콘솔을 통해 액세스를 보호합니다. 기본 수준의 액세스 제어를 사용하려면 사용자 인증 데이터에 표준 역할을 추가합니다(예: users.properties
파일을 편집하여). 또한 관련 ACL(액세스 제어 목록) 파일을 편집하여 액세스 제어를 사용자 지정할 수도 있습니다.
2.2.1.1. 메커니즘
Karaf의 역할 기반 액세스 제어는 다음과 같은 메커니즘을 기반으로 합니다.
- Cryostat Guard
- Karaf 컨테이너는 들어오는 모든 Cryostat 호출을 가로채고 구성된 Cryostat 액세스 제어 목록을 통해 호출을 필터링하는 Cryostat 가드로 구성됩니다. Cryostat 가드는 JVM 수준에서 구성되므로 예외 없이 모든 Cryostat 호출을 가로챌 수 있습니다.
- OSGi Service Guard
- 모든 OSGi 서비스의 경우 OSGi 서비스 가드를 구성할 수 있습니다. OSGi 서비스 가드는 클라이언트와 원래 OSGi 서비스 간에 교차하는 프록시 오브젝트로 구현됩니다. 각 OSGi 서비스에 대해 OSGi 서비스 가드를 명시적으로 구성해야 합니다. 기본적으로 설치되지 않습니다(카운트 콘솔 명령을 나타내는 OSGi 서비스 제외).
2.2.1.2. 보호의 종류
역할 기반 액세스 제어의 Fuse 구현은 다음과 같은 유형의 보호 기능을 제공할 수 있습니다.
- Fuse 콘솔(Hawtio)
- Fuse 콘솔(Hawtio)을 통한 컨테이너 액세스는 Cryostat ACL 파일에 의해 제어됩니다. Fuse Console을 제공하는 REST/HTTP 서비스는 Jolokia 기술을 사용하여 구현되며, 위의 계층이 됩니다. 따라서 궁극적으로 모든 Fuse Console 호출은 Cryostat를 통과하고 Cryostat ACL에 의해 규제됩니다.
- JMX
- Karaf 컨테이너의 Cryostat 포트에 대한 직접 액세스는 Cryostat ACL에 의해 규제됩니다. 또한 Karaf 컨테이너에서 실행 중인 애플리케이션에서 열어 둔 추가 Cryostat 포트도 JVM 수준에서 설정되므로 Cryostat ACL에 의해 규제됩니다.
- Karaf 명령 콘솔
Karaf 명령 콘솔에 대한 액세스는 콘솔 ACL 파일에 의해 규제됩니다. Karaf 콘솔에 액세스하는 방법에 관계없이 액세스 제어가 적용됩니다. Fuse Console을 통해 명령 콘솔에 액세스하든 SSH 프로토콜을 통해 액세스 제어가 두 경우 모두 적용됩니다.
참고명령줄에서 Karaf 컨테이너를 직접 시작하고(예:
./bin/fuse
스크립트 사용) 사용자 인증이 수행되지 않는 특수한 경우etc/system.properties
파일의karaf.local.roles
속성에 의해 지정된 역할을 자동으로 가져옵니다.- OSGi 서비스
- Karaf 컨테이너에 배포된 모든 OSGi 서비스의 경우 선택적으로 ACL 파일을 활성화하여 특정 역할에 대한 메서드 호출을 제한할 수 있습니다.
2.2.1.3. 사용자 역할 추가
역할 기반 액세스 제어 시스템에서 사용자 인증 데이터에 역할을 추가하여 사용자에게 권한을 부여할 수 있습니다. 예를 들어 etc/users.properties
파일의 다음 항목은 admin
사용자를 정의하고 admin
역할을 부여합니다.
admin = secretpass,group,admin,manager,viewer,systembundles,ssh
또한 사용자 그룹을 정의한 다음 특정 사용자 그룹에 사용자를 할당할 수도 있습니다. 예를 들어 다음과 같이 admingroup
사용자 그룹을 정의하고 사용할 수 있습니다.
admin = secretpass, _g_:admingroup _g_\:admingroup = group,admin,manager,viewer,systembundles,ssh
사용자 그룹은 모든 유형의 JAAS 로그인 모듈에서 지원되지 않습니다.
2.2.1.4. 표준 역할
표 2.2. “액세스 제어를 위한 표준 역할” Cryostat ACL 및 명령 콘솔 ACL 전체에서 사용되는 표준 역할을 나열하고 설명합니다.
역할 | 설명 |
---|---|
| Karaf 컨테이너에 대한 읽기 전용 액세스 권한을 부여합니다. |
| 애플리케이션을 배포 및 실행하려는 일반 사용자에게 적절한 수준에서 읽기-쓰기 액세스 권한을 부여합니다. 그러나 중요한 Karaf 컨테이너 구성 설정에 대한 액세스를 차단합니다. |
| Karaf 컨테이너에 대한 무제한 액세스 권한을 부여합니다. |
| 사용자에게 Karaf 명령 콘솔(ssh 포트를 통해)에 연결할 수 있는 권한을 부여합니다. |
2.2.1.5. ACL 파일
표준 ACL 파일 세트는 다음과 같이 Fuse 설치의 etc/auth/
디렉터리에 있습니다.
etc/auth/jmx.acl[.*].cfg
- Cryostat ACL 파일.
etc/auth/org.apache.karaf.command.acl.*.cfg
- 명령 콘솔 ACL 파일.
2.2.1.6. 역할 기반 액세스 제어 사용자 정의
전체 Cryostat ACL 파일 세트 및 명령 콘솔 ACL 파일은 기본적으로 제공됩니다. 시스템 요구 사항에 맞게 필요에 따라 이러한 ACL을 사용자 지정할 수 있습니다. 이 작업을 수행하는 방법에 대한 자세한 내용은 다음 섹션에서 확인할 수 있습니다.
2.2.1.7. 액세스 제어를 위한 추가 속성
etc
디렉토리 아래의 system.properties
파일은 Karaf 명령 콘솔 및 Fuse 콘솔(Hawtio)을 통해 액세스를 제어하기 위해 다음과 같은 추가 속성을 제공합니다.
karaf.local.roles
- 사용자가 Karaf 컨테이너 콘솔을 로컬 로 시작할 때 적용되는 역할을 지정합니다(예: 스크립트 실행).
hawtio.roles
- Fuse 콘솔을 통해 Karaf 컨테이너에 액세스할 수 있는 역할을 지정합니다. 이 제약 조건은 Cryostat ACL 파일에서 정의한 액세스 제어 외에도 적용됩니다.
karaf.secured.command.compulsory.roles
-
Karaf console 명령을 호출하는 데 필요한 기본 역할을 지정합니다. console 명령이 명령 ACL 파일에 의해 명시적으로 구성되지 않은 경우
etc/auth/org.apache.karaf.command.acl.*.cfg
.cfg .cfg . 명령을 호출하려면 목록에서 역할 중 하나 이상을 사용하여 사용자를 구성해야 합니다. 값은 쉼표로 구분된 역할 목록으로 지정됩니다.
2.2.2. Cryostat ACL 사용자 지정
Cryostat ACL은 OSGi Config Admin Service에 저장되며 일반적으로 etc/auth/jmx.acl.*.cfg
.cfg 파일로 액세스할 수 있습니다. 이 섹션에서는 이러한 파일을 직접 편집하여 Cryostat ACL을 사용자 지정하는 방법을 설명합니다.
2.2.2.1. 아키텍처
그림 2.1. “Access Control Mechanism for Cryostat” Karaf 컨테이너에 대한 Cryostat 연결에 대한 역할 기반 액세스 제어 메커니즘에 대한 개요를 보여줍니다.
그림 2.1. Access Control Mechanism for Cryostat
2.2.2.2. 작동 방식
Cryostat 액세스 제어는 특수 javax.management.MBeanServer
오브젝트를 통해 Cryostat에 대한 원격 액세스를 제공하여 작동합니다. 이 오브젝트는 org.apache.karaf.management.KarafMBeanServerGuard
오브젝트를 호출하여 프록시 역할을 합니다. Cryostat 가드는 시작 파일에서 특별한 구성없이 사용할 수 있습니다.
Cryostat 액세스 제어는 다음과 같이 적용됩니다.
- 로컬이 아닌 모든 호출에 대해 Cryostat 가드를 실제 호출 전에 호출됩니다.
- Cryostat Guard는 사용자가 액세스하려고 하는 경우(이 경우 ACL이 OSGi Config Admin 서비스에 저장된)에 대한 관련 ACL을 조회합니다.
- ACL은 특정 호출을 수행할 수 있는 역할 목록을 반환합니다.
- Cryostat Guard는 현재 보안 주체에 대한 역할 목록을 확인하여 현재 사용자에게 필요한 역할이 있는지 여부를 확인합니다.
-
일치하는 역할이 없는 경우 Cryostat 호출이 차단되고
SecurityException
이 발생합니다.
2.2.2.3. Cryostat ACL 파일의 위치
Cryostat ACL 파일은 InstallDir/etc/auth
디렉터리에 있습니다. 여기서 ACL 파일 이름은 다음 규칙을 따릅니다.
etc/auth/jmx.acl[.*].cfg
기술적으로 ACL은 패턴 jmx.acl[.*]
과 일치하는 OSGi 영구 ID(PID)에 매핑됩니다. 이는 Karaf 컨테이너가 기본적으로 etc/
디렉터리 아래에 OSGi PID를 파일 PID.cfg
로 저장하는 것입니다.
2.2.2.4. ACL 파일 이름에 Cryostat 매핑
Cryostat Guard는 Cryostat를 통해 액세스하는 모든 Cryostat 클래스에 액세스 제어를 적용합니다(사용자의 애플리케이션 코드에서 정의한 모든 Cryostat 포함). 특정 Cryostat 클래스의 ACL 파일은 jmx.acl
접두사를 추가하여 Cryostat의 오브젝트 이름에서 파생됩니다. 예를 들어 org.apache.camel:type=context
에서 Object Name이 지정하는 Cryostat가 있는 경우 해당 PID는 다음과 같습니다.
jmx.acl.org.apache.camel.context
OSGi Config Admin 서비스는 이 PID 데이터를 다음 파일에 저장합니다.
etc/auth/jmx.acl.org.apache.camel.context.cfg
2.2.2.5. ACL 파일 형식
Cryostat ACL 파일의 각 줄은 다음 형식의 항목입니다.
Pattern = Role1[,Role2][,Role3]...
여기서 Pattern
은 ScanSetting의 메서드 호출과 일치하는 패턴이며, 등호 오른쪽은 사용자에게 해당 호출을 수행할 수 있는 권한을 부여하는 쉼표로 구분된 역할 목록입니다. 가장 간단한 경우 Pattern
은 단순히 메서드 이름입니다. 예를 들어 jmx.acl.hawtio.OSGiTools
Cryostat에 대한 다음 설정과 마찬가지로 ( jmx.acl.hawtio.OSGiTools.cfg
파일에서)
getResourceURL = admin, manager, viewer getLoadClassOrigin = admin, manager, viewer
와일드카드 문자 *
를 사용하여 여러 메서드 이름과 일치시킬 수도 있습니다. 예를 들어 다음 항목은 set
로 시작하는 모든 메서드 이름을 호출할 수 있는 권한을 부여합니다.
set* = admin, manager, viewer
그러나 ACL 구문은 메서드 호출에 대한 훨씬 더 세분화된 제어를 정의할 수 있습니다. 특정 인수와 함께 호출된 메서드 또는 정규식과 일치하는 인수와 일치하도록 패턴을 정의할 수 있습니다. 예를 들어 org.apache.karaf.config
에 대한 ACL은 일반 사용자가 민감한 구성 설정을 수정하지 못하도록 이 기능을 악용합니다. 이 패키지의 create
방법은 다음과 같이 제한됩니다.
create(java.lang.String)[/jmx[.]acl.*/] = admin create(java.lang.String)[/org[.]apache[.]karaf[.]command[.]acl.+/] = admin create(java.lang.String)[/org[.]apache[.]karaf[.]service[.]acl.+/] = admin create(java.lang.String) = admin, manager
이 경우 manager
역할에는 일반적으로 create
메서드를 호출할 수 있는 권한이 있지만 admin
역할만 jmx.acl.*
, org.apache.karaf.command.acl.*
또는 org.apache.karaf.service.*
와 일치하는 PID 인수를 사용하여 create
를 호출할 수 있는 권한이 있습니다.
ACL 파일 형식에 대한 자세한 내용은 etc/auth/jmx.acl.cfg
파일의 주석을 참조하십시오.
2.2.2.6. ACL 파일 계층 구조
모든 단일 Cryostat에 대해 ACL 파일을 제공하는 것이 비실용적인 경우가 많으므로 해당 패키지의 모든 Cryostat에 대한 기본 설정을 제공하는 Java 패키지 수준에서 ACL 파일을 지정하는 옵션이 있습니다. 예를 들어 org.apache.cxf.Bus
Cryostat는 다음 PID 수준에서 ACL 설정의 영향을 받을 수 있습니다.
jmx.acl.org.apache.cxf.Bus jmx.acl.org.apache.cxf jmx.acl.org.apache jmx.acl.org jmx.acl
가장 구체적인 PID(list의 상단)가 최소 특정 PID(list의 봇)보다 우선합니다.
2.2.2.7. 루트 ACL 정의
루트 ACL 파일인 jmx.acl.cfg
는 모든 Cryostat에 대한 기본 ACL 설정을 제공하므로 특별한 경우입니다. 루트 ACL에는 기본적으로 다음과 같은 설정이 있습니다.
list* = admin, manager, viewer get* = admin, manager, viewer is* = admin, manager, viewer set* = admin * = admin
이는 일반적인 읽기 방법 패턴(list*
, get*
, is*
)은 모든 표준 역할에서 액세스할 수 있지만 일반적인 쓰기 방법 패턴 및 기타 메서드(설정* 및
)는 관리자 역할인 \*
admin
에서만 액세스할 수 있습니다.
2.2.2.8. 패키지 ACL 정의
etc/auth/jmx.acl[.*].cfg
에 제공된 표준 Cryostat ACL 파일의 대부분은 Cryostat 패키지에 적용됩니다. 예를 들어 org.apache.camel.endpoints
에 대한 ACL은 다음 권한으로 정의됩니다.
is* = admin, manager, viewer get* = admin, manager, viewer set* = admin, manager
2.2.2.9. 사용자 지정 Cryostat에 대한 ACL
자체 애플리케이션에서 사용자 지정 Cryostat를 정의하는 경우 이러한 사용자 지정 Cryostat는 ACL 메커니즘과 자동으로 통합되고 Karaf 컨테이너에 배포할 때 Cryostat Guard에 의해 보호됩니다. 그러나 기본적으로 your Cryostat는 일반적으로 기본 루트 ACL 파일인 jmx.acl.cfg
에서만 보호됩니다. 보다 세분화된 ACL을 정의하려면 표준 Cryostat ACL 파일 이름 지정 규칙을 사용하여 etc/auth
아래에 새 ACL 파일을 만듭니다.
예를 들어 사용자 지정 Cryostat 클래스에 Cryostat 개체 이름, org.example:type=MyMBean
이 있는 경우 etc/auth
디렉터리에 새 ACL 파일을 생성합니다.
jmx.acl.org.example.MyMBean.cfg
2.2.2.10. 런타임에 동적 구성
OSGi Config Admin 서비스는 동적이므로 시스템이 실행되는 동안 ACL 설정을 변경할 수 있으며 특정 사용자가 로그인되는 경우에도 변경할 수 있습니다. 따라서 시스템이 실행되는 동안 보안 위반을 발견하면 Karaf 컨테이너를 다시 시작할 필요 없이 관련 ACL 파일을 편집하여 시스템의 특정 부분에 대한 액세스를 즉시 제한할 수 있습니다.
2.2.3. 명령 콘솔 ACL 사용자 정의
명령 콘솔 ACL은 OSGi Config Admin Service에 저장되며 일반적으로 etc/auth/org.apache.karaf.command.acl.*.cfg
.cfg .cfg 로 액세스할 수 있습니다. 이 섹션에서는 이러한 파일을 직접 편집하여 명령 콘솔 ACL을 사용자 지정하는 방법을 설명합니다.
2.2.3.1. 아키텍처
그림 2.2. “OSGi 서비스의 제어 메커니즘 액세스” Karaf 컨테이너의 OSGi 서비스에 대한 역할 기반 액세스 제어 메커니즘에 대한 개요를 보여줍니다.
그림 2.2. OSGi 서비스의 제어 메커니즘 액세스
2.2.3.2. 작동 방식
실제로 명령 콘솔 액세스 제어 메커니즘은 OSGi 서비스의 일반 액세스 제어 메커니즘을 기반으로 합니다. 따라서 콘솔 명령이 구현되고 OSGi 서비스로 노출됩니다. Karaf 콘솔 자체는 OSGi 서비스 레지스트리를 통해 사용 가능한 명령을 검색하고 OSGi 서비스로 명령에 액세스합니다. 따라서 OSGi 서비스의 액세스 제어 메커니즘을 사용하여 콘솔 명령에 대한 액세스를 제어할 수 있습니다.
OSGi 서비스 보안을 위한 메커니즘은 OSGi 서비스 레지스트리 후크를 기반으로 합니다. 이는 특정 소비자의 OSGi 서비스를 숨기고 OSGi 서비스를 프록시 서비스로 교체할 수 있는 고급 OSGi 기능입니다.
서비스 가 특정 OSGi 서비스에 대해 배치되면 OSGi 서비스에서 클라이언트 호출이 다음과 같이 진행됩니다.
- 호출은 요청된 OSGi 서비스로 직접 이동하지 않습니다. 대신 요청은 원래 서비스와 동일한 서비스 속성(및 일부 추가)이 있는 대체 프록시 서비스로 라우팅됩니다.
- 서비스 가드에서 대상 OSGi 서비스에 대한 관련 ACL을 조회합니다(이 경우 ACL이 OSGi Config Admin 서비스에 저장된 위치).
- ACL은 이 특정 메서드 호출을 서비스에서 수행할 수 있는 역할 목록을 반환합니다.
-
이 명령에 대한 ACL을 찾을 수 없는 경우 서비스 가 기본적으로
etc/system.properties
파일의karaf.secured.command.compulsory.roles
속성에 지정된 역할 목록으로 설정됩니다. - 서비스 가드에서 현재 보안 주체에 대해 역할 목록을 확인하여 현재 사용자에게 필요한 역할이 있는지 여부를 확인합니다.
-
일치하는 역할이 없는 경우 메서드 호출이 차단되고
SecurityException
이 발생합니다. - 또는 일치하는 역할이 있으면 메서드 호출이 원래 OSGi 서비스에 위임됩니다.
2.2.3.3. 기본 보안 역할 구성
해당 ACL 파일이 없는 명령에 대해 etc/system.properties
파일에서 karaf.secured.command.compulsory.roles
속성을 설정하여 보안 역할의 기본 목록을 지정합니다(콤마로 구분된 역할 목록으로 지정됨).
2.2.3.4. 명령 콘솔 ACL 파일의 위치
명령 콘솔 ACL 파일은 InstallDir/etc/auth
디렉터리에 있으며 접두사 org.apache.karaf.command.acl
.
2.2.3.5. 명령 범위를 ACL 파일 이름에 매핑
명령 콘솔 ACL 파일 이름은 다음 규칙을 따릅니다.
etc/auth/org.apache.karaf.command.acl.CommandScope.cfg
여기서 CommandScope
는 특정 Karaf 콘솔 명령의 접두사에 해당합니다. 예를 들어
및 feature
:installfeatures:uninstall
명령은 해당 ACL 파일 org.apache.karaf.command.acl.features.cfg
가 있는 feature 명령 범위에 속합니다.
2.2.3.6. ACL 파일 형식
명령 콘솔 ACL 파일의 각 줄은 다음 형식의 항목입니다.
Pattern = Role1[,Role2][,Role3]...
여기서 Pattern
은 현재 명령 범위의 Karaf console 명령과 일치하는 패턴이며 등호 오른쪽은 사용자가 해당 호출을 수행할 수 있는 권한을 부여하는 쉼표로 구분된 역할 목록입니다. 가장 간단한 경우 Pattern
은 단순히 범위가 지정되지 않은 명령 이름입니다. 예를 들어 org.apache.karaf.command.acl.feature.cfg
ACL 파일에는 기능
명령에 대한 다음 규칙이 포함됩니다.
list = admin, manager, viewer repo-list = admin, manager, viewer info = admin, manager, viewer version-list = admin, manager, viewer repo-refresh = admin, manager repo-add = admin, manager repo-remove = admin, manager install = admin uninstall = admin
특정 명령 이름에 일치하는 항목이 없는 경우 이 명령에 역할이 필요하지 않으며 모든 사용자가 호출할 수 있다고 가정합니다.
특정 인수와 함께 호출된 명령 또는 정규식과 일치하는 인수와 일치하도록 패턴을 정의할 수도 있습니다. 예를 들어 org.apache.karaf.command.acl.bundle.cfg
ACL 파일은 일반 사용자가 -f
(force) 플래그를 사용하여 bundle:start
및 bundle:stop
명령을 호출하지 못하도록 합니다(시스템 번들을 관리하도록 지정해야 함). 이 제한은 ACL 파일에서 다음과 같이 코딩됩니다.
start[/.*[-][f].*/] = admin start = admin, manager stop[/.*[-][f].*/] = admin stop = admin, manager
이 경우 manager
역할에는 일반적으로 bundle:start
및 bundle:stop
명령을 호출할 수 있는 권한이 있지만 admin
역할만 force 옵션 -f
를 사용하여 이러한 명령을 호출할 수 있는 권한이 있습니다.
ACL 파일 형식에 대한 자세한 내용은 etc/auth/org.apache.karaf.command.acl.bundle.cfg
파일에서 주석을 참조하십시오.
2.2.3.7. 런타임에 동적 구성
명령 콘솔 ACL 설정은 완전히 동적이므로 시스템이 실행되는 동안 ACL 설정을 변경할 수 있으며 변경 사항은 이미 로그인한 사용자에게도 몇 초 내에 적용됩니다.
2.2.4. OSGi 서비스에 대한 ACL 정의
모든 OSGi 서비스(시스템 수준 또는 애플리케이션 수준)에 대한 사용자 지정 ACL을 정의할 수 있습니다. 기본적으로 OSGi 서비스에는 액세스 제어가 활성화되지 않습니다(명령 콘솔 ACL 파일로 미리 구성된 Karaf 콘솔 명령을 노출하는 OSGi 서비스 제외). 이 섹션에서는 OSGi 서비스에 대한 사용자 지정 ACL을 정의하는 방법과 지정된 역할을 사용하여 해당 서비스에서 메서드를 호출하는 방법을 설명합니다.
2.2.4.1. ACL 파일 형식
OSGi 서비스 ACL 파일에는 다음과 같이 이 ACL이 적용되는 OSGi 서비스를 식별하는 특수 항목이 한 개 있습니다.
service.guard = (objectClass=InterfaceName)
여기서 service.guard
는 일치하는 OSGi 서비스를 선택하기 위해 OSGi 서비스 속성의 레지스트리에 적용되는 LDAP 검색 필터입니다. 가장 간단한 유형의 필터 (objectClass=InterfaceName)
는 지정된 Java 인터페이스 이름 InterfaceName
을 사용하여 OSGi 서비스를 선택합니다.
ACL 파일의 나머지 항목은 다음과 같습니다.
Pattern = Role1[,Role2][,Role3]...
Pattern
은 서비스 방법과 일치하는 패턴이며 등호 오른쪽은 사용자에게 해당 호출을 수행할 수 있는 권한을 부여하는 쉼표로 구분된 역할 목록입니다. 이러한 항목의 구문은 기본적으로 Cryostat ACL 파일의 항목과 동일합니다. “ACL 파일 형식” 을 참조하십시오.
2.2.4.2. 사용자 지정 OSGi 서비스에 대한 ACL을 정의하는 방법
사용자 지정 OSGi 서비스에 대한 ACL을 정의하려면 다음 단계를 수행합니다.
Java 인터페이스를 사용하여 OSGi 서비스를 정의하는 것이 일반적입니다(일반 Java 클래스를 사용할 수 있지만 권장되지 않음). 예를 들어 OSGi 서비스로 노출하려는 Java 인터페이스
MyService
를 고려해 보십시오.package org.example; public interface MyService { void doit(String s); }
Java 인터페이스를 OSGi 서비스로 노출하려면 일반적으로 OSGi 블루프린트 XML 파일에
service
요소를 추가합니다. 블루프린트 XML 파일은 일반적으로 Maven 프로젝트의src/main/resources/OSGI-INF/blueprint
디렉터리에 저장됩니다. 예를 들어MyService
ImplMyService
OSGi 서비스를 노출할 수 있습니다.<?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" default-activation="lazy"> <bean id="myserviceimpl" class="org.example.MyServiceImpl"/> <service id="myservice" ref="myserviceimpl" interface="org.example.MyService"/> </blueprint>
OSGi 서비스에 대한 ACL을 정의하려면
org.apache.karaf.service.acl
접두사를 사용하여 OSGi Config Admin PID를 생성해야 합니다.예를 들어, Karaf 컨테이너(OSGi Config Admin PID)가
etc/auth/
디렉터리에.cfg
파일로 저장된 경우MyService
OSGi 서비스에 대해 다음 ACL 파일을 생성할 수 있습니다.etc/auth/org.apache.karaf.service.acl.myservice.cfg
참고필요한 접두사인
org.apache.karaf.acl
로 시작하는 한 이 파일의 이름을 정확하게 지정하는 것은 중요하지 않습니다. 이 ACL 파일의 해당 OSGi 서비스는 실제로 이 파일의 속성 설정에 의해 지정됩니다(다음 단계에서 볼 수 있음).ACL 파일의 내용을 다음과 같은 형식으로 지정합니다.
service.guard = (objectClass=InterfaceName) Pattern = Role1[,Role2][,Role3]...
service.guard
설정은 OSGi 서비스의InterfaceName
을 지정합니다(OSGi 서비스 속성에 적용되는 LDAP 검색 필터의 구문 사용). ACL 파일의 다른 항목은 일치하는 방법을 지정된 역할에 연결하는패턴
메서드로 구성됩니다. 예를 들어org.apache.karaf.service.acl.myservice.cfg
파일에서 다음 설정을 사용하여MyService
OSGi 서비스에 대한 간단한 ACL을 정의할 수 있습니다.service.guard = (objectClass=org.example.MyService) doit = admin, manager, viewer
마지막으로 이 OSGi 서비스에 대한 ACL을 활성화하려면
etc/system.properties
파일에서karaf.secured.services
속성을 편집해야 합니다.karaf.secured.services
속성의 값에는 LDAP 검색 필터 구문이 있습니다(OSGi 서비스 속성에 적용됨). 일반적으로 OSGi 서비스인ServiceInterface
에 대해 ACL을 활성화하려면 다음과 같이 이 속성을 수정해야 합니다.karaf.secured.services=(|(objectClass=ServiceInterface)(...ExistingPropValue...))
예를 들어
MyService
OSGi 서비스를 활성화하려면 다음을 수행합니다.karaf.secured.services=(|(objectClass=org.example.MyService)(&(osgi.command.scope=*)(osgi.command.function=*)))
karaf.secured.services
속성의 초기 값에는 명령 콘솔 ACL을 활성화하는 설정이 있습니다. 이러한 항목을 삭제하거나 손상시키면 명령 콘솔 ACL이 작동하지 않을 수 있습니다.
2.2.4.3. RBAC로 보안된 OSGi 서비스를 호출하는 방법
사용자 지정 OSGi 서비스(즉, OSGi 서비스의 클라이언트 구현)에서 메서드를 호출하기 위해 Java 코드를 작성하는 경우 Java 보안 API를 사용하여 서비스를 호출하는 데 사용 중인 역할을 지정해야 합니다. 예를 들어 manager
역할을 사용하여 MyService
OSGi 서비스를 호출하려면 다음과 같은 코드를 사용할 수 있습니다.
// Java import javax.security.auth.Subject; import org.apache.karaf.jaas.boot.principal.RolePrincipal; // ... Subject s = new Subject(); s.getPrincipals().add(new RolePrincipal("Deployer")); Subject.doAs(s, new PrivilegedAction() { public Object run() { svc.doit("foo"); // invoke the service } }
이 예에서는 Karaf 역할 유형 org.apache.karaf.jaas.boot.principal.RolePrincipal
를 사용합니다. 필요한 경우 고유한 사용자 지정 역할 클래스를 대신 사용할 수 있지만, 이 경우 OSGi 서비스의 ACL 파일에서 className:roleName
구문을 사용하여 역할을 지정해야 합니다.
2.2.4.4. OSGi 서비스에 필요한 역할을 검색하는 방법
ACL로 보안된 OSGi 서비스에 대해 코드를 작성하는 경우 서비스를 호출할 수 있는 역할을 확인하는 것이 유용할 수 있습니다. 이를 위해 프록시 서비스는 추가 OSGi 속성 org.apache.karaf.service.guard.roles
를 내보냅니다. 이 속성의 값은 해당 서비스에서 메서드를 호출할 수 있는 모든 역할 목록을 포함하는 java.util.Collection
개체입니다.