8 시큐리티에 대해 - xrath.com 에서 번역됨

목차 | 전의 항목 | 다음의 항목 | JNDI API

## 8. 시큐리티에 대해

> JNDI 의 설정에는, 시큐리티 매니저를 인스톨 하는 경우로 하지 않는 경우가 있습니다.

> 시큐리티 매니저를 인스톨 하지 않고 Java 어플리케이션을 실행하고 있는 경우는, 신뢰된 코드로서 로컬 클래스 패스로부터 서비스 프로바이더에 액세스 할 수 있습니다. 서비스 프로바이더가 로컬 파일에 액세스 하거나 네트워크상의 임의의 장소에 있는 네이밍 서버 또는 디렉토리 서버에 네트워크 접속하거나 할 경우에도, 제한은 존재하지 않습니다.

> 인스톨 된 시큐리티 매니저와 함께 동작하는 애플릿 또는 어플리케이션의 경우는, 같은 애플릿 또는 어플리케이션내에서, 신뢰된 코드와 신뢰되어 있지 않은 코드가 혼재합니다. 이 경우는, 「문맥 핸들의 공유」 및 「문맥 환경」을 참조해 주세요. 인스톨 된 시큐리티 매니저와 함께 동작하는 애플릿 또는 어플리케이션에서는, 서비스 프로바이더에 액세스 할 경우에 다양한 제한이 적용됩니다. 특히, 자원이 한정되어 있는 경우 (파일 시스템, 네트워크 접속등)는, 크게 제한됩니다.

### 8.1 JNDI 클래스

> JNDI 패키지의 클래스에는, 네이티브 메소드는 짜넣어지고 있지 않습니다. 이러한 클래스는, 애플릿 또는 어플리케이션내에서 실행할 경우에, 특히 인스톨 할 필요는 없습니다.

> JNDI 에서는, 몇개의 시스템 프로퍼티이 사용됩니다 (「어플리케이션 스코프 또는 애플릿 스코프의 JNDI 표준 프로퍼티」을 참조). 시스템 프로퍼티을 사용하면, 프로그래밍을 거의 실시하지 않고 , 애플릿 및 어플리케이션을 간단하게 구성할 수가 있습니다. 다만, 애플릿 또는 어플리케이션이 실행되고 있는 플랫폼에 시큐리티 매니저를 인스톨 했을 경우는, 그 애플릿 또는 어플리케이션으로부터 일부 또는 모든 시스템 프로퍼티에의 액세스가 제한되는 일이 있습니다. JNDI 에서는, 이러한 프로퍼티을, resource file의 애플릿 파라미터, 또는 문맥에 건네주는 환경 프로퍼티으로서 지정할 수 있습니다.

> Java 2 플랫폼에서는, JNDI 클래스는「어플리케이션 스코프 또는 애플릿 스코프의 JNDI 표준 프로퍼티」내의 시스템 프로퍼티에 액세스 할 경우에,`doPrivileged` 블록을 사용합니다.

### 8.2 시큐리티 모델

> JNDI 에는, 네이밍 서버 및 디렉토리 서버에 액세스하기 위한 , 시큐리티 모델 또는 공통의 시큐리티 인터페이스가 정의되고 있지 않습니다. 디렉토리 서비스에 대한 인증 또는 액세스 제어에 필요한 조작 등, 시큐리티 관련의 조작은, 각 서비스 프로바이더에 의해 처리됩니다. JNDI 에서는, 서비스에의 접속을 확립할 경우에, 어플리케이션 또는 애플릿으로부터 시큐리티 관련의 정보를 서비스 프로바이더에 건네줄 수가 있습니다. 다만, JNDI 자체는, 시큐리티 관련의 동작에는 관여하지 않습니다.

> JNDI 에서는, 시큐리티 관련의 문제는, 시큐리티 관련의 예외로서 클라이언트에 통지됩니다.

> JNDI 서비스 프로바이더는, 파일 시스템 또는 네트워크등의 보호된 자원에 액세스 할 경우에, 시큐리티 매니저에 의해 적절히 제어됩니다. 일부의 서비스 프로바이더에서는, Java 2 플랫폼의 시큐리티 아키텍쳐(architecture)에 의해 디렉토리 액세스가 제어됩니다 (예를 들어, 관리 관련의 애플릿으로 특별한 포트에의 액세스를 가능하게 하는 등).

### 8.3 서버에의 액세스

> 네임 서비스 및 디렉토리 서비스에는 일반적으로, 포함되고 있는 정보를 보호하기 위한 독자적인 시큐리티 시스템이 짜넣어지고 있습니다. 예를 들어, 특정의 디렉토리에서는, 디렉토리내의 정보의 읽어내 또는 갱신을 실시할 때, 최초로 디렉토리에 「로그인」할 필요가 있습니다. 일부의 서비스에서는, 이름 공간 또는 디렉토리의 특정의 부분에 익명으로 액세스 할 수가 있습니다.

> 시큐리티상의 이유에 의해, 서비스에 로그인한 후에, 신뢰되어 있지 않은 코드와 특권을 공유하지 않게 할 필요가 있습니다.

### 8.4 문맥 핸들의 공유

> 여기에서는,`Context` 인스턴스에의 참조를, 「문맥 핸들」이라고 표현합니다. 이것은,`Reader`,`Writer`,`InputStream`, 및 `OutputStream` 인스턴스에의 참조가, 「파일 핸들」이라고 불리는 것으로 닮았습니다.

> 문맥 핸들은, 그 외의 보호된 자원과 같게 처리할 필요가 있습니다. 신뢰된 코드에 의해 문맥 핸들이 취득되었을 경우는 (액세스는 디렉토리 서버로 인증된다), 인증 또는 신뢰되어 있지 않은 코드에 대해서 그 문맥의 사용이 보호됩니다. 이것은, 어플리케이션 또는 애플릿의 코드, 혹은 그 양쪽 모두에 의해, 파일 핸들이 보호되는 것으로 닮았습니다. 예를 들어, 신뢰된 코드에 의해 출력 파일이 열렸을 경우 (특권은, 코드의 신뢰성에 근거해 주어진다), 파일 핸들을 그 외 코드에 건네줄 때는, 코드의 신뢰성에 주의할 필요가 있습니다.

> 또, 문맥 핸들의 액세스권을 신뢰되어 있지 않은 코드에게 주면(자), 디렉토리내의 정보에 대해서 액세스 또는 갱신을 실시할 때, 혹은 문맥에 관련지을 수 있었던 시큐리티 환경 프로퍼티에 액세스 할 경우에, 그 문맥 핸들이 부정하게 사용되는 일이 있습니다.

### 8.5 문맥 환경

> JNDI 에서는, 환경에 응한 형식에서, 어플리케이션 또는 애플릿으로부터 문맥으로 설정 및 정보를 건네줄 수가 있습니다. 어플리케이션 또는 애플릿에서는, 문맥으로부터 현재의 환경을 취득할 수도 있습니다. 문맥의 환경의 자세한 것은,「구성」 및 「부록 A」를 참조해 주세요.

> 문맥의 환경에 포함되어 있는 정보는, 중요한 것이 많아, 신뢰되어 있지 않은 액세스로부터 보호할 필요가 있습니다. 특히, 환경 프로퍼티 `java.naming.security.principal` 및 `java.naming.security.credentials` 에는, 신뢰되어 있지 않은 코드에는 건네주어서는 안 되는 정보도 포함되어 있습니다. 서비스 프로바이더에는, 이러한 프로퍼티에 대한 액세스를 방지하기 위한 대책이 필요합니다 ( 「서비스 프로바이더에 필요한 조작」을 참조). 중요한 환경 프로퍼티은, 클라이언트 어플리케이션 및 애플릿으로부터 신뢰되어 있지 않은 코드에 건네주지 않게 할 필요가 있습니다.

### 8.6 클래스의 로드

> JNDI 에서는, 클래스 파일을 동적으로 로드할 수 있습니다.

> JNDI 가 JDK 1.1.x 플랫폼상에서 동작하고 있을 때는, RMI 클래스 로더가 사용됩니다. 클래스는, 시큐리티 매니저가 인스톨 되어 로드가 허가되고 있는 경우에만 로드할 수 있습니다. 이러한 클래스가 로드 되면(자), 시큐리티 매니저에게 정의한 시큐리티 문맥내에서 실행됩니다.

> Java 2 플랫폼에서 JNDI 가 실행되면(자),`java.net.URLClassLoader` 를 사용해 코드 베이스로 지정된 장소로부터 이러한 클래스의 로드가 시도됩니다. 클래스가 정상적으로 로드 되기 위해서(때문에)는, 어플리케이션과 JNDI 클래스 및 서비스 프로바이더 클래스에, 코드 베이스내에서 지정된 URL 에의 적절한 권한을 부여할 필요가 있습니다. 예를 들어, URL schema가 「http」또는 「ftp」의 경우는, 적절한 `java.net.SocketPermission` 를 어플리케이션에게 줄 필요가 있습니다. URL schema가 「file」의 경우는,`java.io.FilePermission` 를 줄 필요가 있습니다.

### 8.7 직렬화 가능 객체

> 몇개의 JNDI 클래스는, 직렬화할 수가 있습니다. 직렬화하면(자), 바이트 스트림의 형식에서 객체에 액세스 할 수 있습니다. 이 때, 작성된 환경의 외부로부터 액세스 할 수도 있습니다. 직렬화 된 객체에 관련한 시큐리티에 대해서는, 다음의 URL 에 있는 문서를 참조해 주세요.

> http://java.sun.com/products/jdk/1. 2/ja/docs/ja/guide/serialization/spec/security.doc.html

### 8.8 서비스 프로바이더에 필요한 조작

#### 8.8. 1 문맥 환경

> 초기 문맥의 취득 또는 룩 업을 실시하는지, 디렉토리로부터 초기 문맥을 작성했을 때에, 문맥 핸들이 작성됩니다. 그 문맥 핸들에 대해서 환경 프로퍼티을 지정할 수 있습니다. 문맥 핸들의 작성시에, 시큐리티 관련의 프로퍼티이 필요하게 되는 일이 있습니다 (디렉토리내의 사용자의 「로그」를 기록하는 사용자 정보 등). 서비스 프로바이더에서는, 신뢰되어 있지 않은 코드로부터 중요한 정보를 보호할 필요가 있습니다.

> 서비스 프로바이더에서는, 문맥의 환경을, 신뢰되어 있지 않은 코드에 의한 개변 또는 변경으로부터 보호할 필요가 있습니다. 또, 중요한 환경 프로퍼티을, 신뢰되어 있지 않은 코드에 의한 읽기로부터 보호할 필요가 있습니다. 이것들을 보호하려면 몇개의 방법이 있습니다. 예를 들어, thread의 실행 문맥 또는 신뢰 레벨, 혹은 그 양쪽 모두가, 문맥 핸들을 작성한 thread의 초기 속성과 다른 경우는, 그 문맥 핸들의 사용을 금지합니다. 또는, 중요한 환경 프로퍼티에의 액세스 등, 특정의 조작을 금지합니다. 혹은, 중요한 환경 프로퍼티을 돌려주지 않는가 신뢰된 코드에만 돌려줍니다.

#### 8.8. 2 네트워크세큐리티

> 신뢰되어 있지 않은 코드 (신뢰되어 있지 않은 애플릿의 코드등)는, 네트워크에의 액세스가 제한되고 있습니다. 예를 들어, 신뢰되어 있지 않은 애플릿으로부터는, 다운로드원의 호스트 이외에는 네트워크 접속을 작성할 수 없습니다. 시큐리티 모델을 보다 상세하게 조정하면(자), 서비스 프로바이더 자체로부터, 신뢰된 코드로서 신뢰되어 있지 않은 애플릿으로부터는 접속할 수 없는 호스트에게 접속할 수가 있습니다. 이 경우, 서비스 프로바이더에서는, 시큐리티 매니저에게 정의되고 있는 시큐리티가 저하하지 않게 주의할 필요가 있습니다. 신뢰되어 있지 않은 애플릿으로부터 디렉토리로 액세스 해도, 시큐리티상의 문제가 발생하지 않는 것이 보증되고 있는 경우는, 신뢰되어 있지 않은 코드에 대해서 서비스를 제공할 수도 있습니다. 예를 들어, 신뢰되어 있지 않은 코드로부터 디렉토리에 대한 「익명」의 액세스를 허가해도, 시큐리티 문제가 발생하지 않는 것이 있습니다만, 이것은 그 디렉토리에서는, 익명의 클라이언트 (Java 프로그램 언어 또는 그 외의 언어로 작성)로부터 그 데이터에의 액세스가 벌써 허가되고 있기 (위해)때문에입니다.

> 대부분의 네임 서비스 및 디렉토리 서비스에는, 네트워크 경유로 액세스 합니다. 요구된 데이터가 서버의 인증 및 액세스 제어 기구에 의해 보호되고 있는 경우에서도, 일부의 프로토콜에서는, 응답으로서 송신되는 데이터가 보호되지 않는 (암호화되지 않는다) 것이 있습니다. 이 문제는, JNDI 를 사용하고 있는 클라이언트 뿐만이 아니라, 디렉토리에 액세스 하고 있는 모든 클라이언트로 발생합니다. 서비스 프로바이더는, 네트워크 경유로 관련하는 디렉토리를 사용할 경우에 발생하는 시큐리티상의 문제에 대해, 문서에 명기할 필요가 있습니다.

#### 8.8. 3 로컬 파일에의 액세스

> 네트워크 액세스와 같게, 로컬 파일 시스템 액세스의 경우도, 신뢰되어 있지 않은 코드에는 제한이 적용됩니다. 서비스 프로바이더에 로컬 파일에 대한 액세스 특권이 주어지고 있는 경우는, 실행 환경 및 플랫폼에 정의되고 있는 시큐리티 정책가 저하하지 않게, 충분한 대책이 필요합니다.

####

#### 8.8. 4 특권 첨부의 코드, 네이티브 메소드

> 모두 Java 프로그램 언어로 작성된 서비스 프로바이더에, 특권 섹션이 포함되지 않는 경우는, Java 프로그램 언어로 작성된 그 외의 코드에게 줄 수 있었던 시큐리티 정책로 제어됩니다. 그 서비스 프로바이더로부터 액세스 하는 보호된 자원은, 모두 같은 시큐리티 매니저 및 액세스 콘트롤러에 의해 제어됩니다.

> 서비스 프로바이더에 특권 첨부의 코드 섹션 또는 네이티브 메소드가 포함되는 경우는, 실행 환경 및 플랫폼에 정의되고 있는 시큐리티 정책가 보관 유지되도록(듯이) 특별히 주의할 필요가 있습니다.

목차 | 전의 항목 | 다음의 항목

Copyright ©1997-1999 Sun Microsystems, Inc. All Rights Reserved.