본문 바로가기

서버운영 (TA, ADMIN)/정보보안

[SASL] Introduction to GSS-API

Generic Security Service Application Programming Interface (GSS-API)에 대한 정보를 포함하고 있다. 또한 오류 처리, 데이터 타입 및 호출 규칙에 대한 개요도 포함되어 있다.

 - Gerneral information about GSS-API

 - GSS-API services

 - Error handling

 - Data types

 - GSS-API version compatibility

General information about GSS-API

Generic Security Service API (GSS-API)는 Peer to peer 통신을 사용하는 응용 프로그램에 보안 서비스를 제공한다. GSS-API 루틴을 사용하여 응용프로그램은 다음 작업을 수행할 수 있다:

  - 다른 응용 프로그램의 사용자 식별을 결정할 수 있도록 한다.

  - 다른 응용 프로그램에 접근 구너한을 위임할 수 있도록 한다.

  - 메시지별로 기밀성과 무결성과 같은 보안 서비스를 적용할 수 있다.

 

두 통신 응용 프로그램 간의 안전한 연결은 보안 컨텍스트라는 데이터 구조로 표현된다. 안전한 연결을 설정하는 응용 프로그램을 컨텍스트 게시자라고 한다. 컨텍스트 개시자는 원격 프로시저 호출(RPC) 클라이언트와 유사하다. 안전한 연결을 수락하는 응용 프로그램은 컨텍스트 수락자라고 한다. 컨텍스트 수락자는 RPC 서버와 유사하다. GSS-API 루틴은 토큰을 입력 및 출력 값으로 사용한다. 통신하는 응용 프로그램은 적절한 통신 채널을 사용하여 이러한 토큰을 교환할 책임이 있다.

 

GSS-API를 사용하는데는 네가지 단계가 포함된다:

 

1. 컨텍스트 개시자는 다른 프로세스에 자신의 신원을 증명하기 위한 자격 증명을 획득한다. 마찬가지로, 컨텍스트 수락자는 보안 컨텍스트를 수락하기 위한 자격 증명을 획득한다. 어느 응용 프로그램이든 이 자격 증명 획득을 생략하고 기본 자격 증명을 사용할 수 있다.

2. 각 응용 프로그램은 자격 증명을 사용하여 전역 신원을 설정한다. 전역 신원은 응용 프로그램이 실행되는 로컬 사용자 이름과 관련될 수 있지만 반드시 그렇지는 않다. 자격 증명은 기존 로그인 컨텍스트에서 얻거나 키 테이블에서 얻은 주체 이름과 키를 사용하여 생성할 수 있다.

3. 통신하는 응용 프로그램은 인증 토큰을 교환하여 공동 보안 컨텍스트를 설정한다. 보안 컨텍스트는 통신하는 응용 프로그램 간에 공유되는 정보를 포함하는 GSS-API 데이터 구조 쌍이다. 이 정보는 각 응용 프로그램의 상태를 설명한다. 이 보안 컨텍스트는 메시지별 보안 서비스에 필요하다.

  - 보안 컨텍스트를 설정하려면, 컨텍스트 개시자는 `gss_init_sec_context()` 루틴을 호출하여 토큰을 얻는다. 이 토큰은 암호화로 보호된 불투명 데이터이다. 컨텍스트 게시자는 토큰을 컨텍스트 수락자에게 전달하고, 수락자는 이 토큰을 `get_accept_sec_context()` 루틴에 전달하여 공유 정보를 해독하고 추출한다.

  - 보안 컨텍스트를 설정하는 과정의 일환으로, 컨텍스트 개시자는 컨텍스트 수락자에게 인증된다. 컨텍스트 개시자는 상호 인증을 요청하여 컨텍스트 수락자가 자신을 인증하도록 요구할 수 있다.

  - 컨텍스트 개시자는 컨텍스트 수락자가 자신의 대리인으로서 추가 보안 컨텍스트를 개시할 수 있도록 권한을 위임할 수 있다. 위임하려면, 컨텍스트 개시자는 `gss_init_sec_context()` 루틴 호출시 위임을 원한다는 플래그를 설정하고, 반환된 토큰을 정상적으로 컨텍스트 수락자에게 보낸다. 수락자는 이 토큰을 `gss_accept_sec_context()` 루틴에 전달하여 위임된 자격 증명을 생성한다. 컨텍스트 수락자는 반환된 자격 증명을 사용하여 다른 응용 프로그램과 추가 보안 컨텍스트를 개시할 수 있다.

4. 응용 프로그램은 보호된 메시지와 데이터를 교환한다.

  - 응용 프로그램은 GSS-API 루틴을 호출하여 메시지에서 교환되는 데이터를 보호할 수 있다. GSS-API는 응용 프로그램 데이터를 임의의 옥텟 문자열로 취급한다. GSS-API 메시지 보안 서비스는 데이터 출처의 무결성과 인증 또는 기밀성, 무결성 및 데이터 출처의 인증을 제공할 수 있다. 데이터 기밀성을 제공하는 기능은 기본 데이터 암호화 지원의 기능에 따라 달라진다.

5. 응용 프로그램이 통신을 마치면, 어느 쪽이든 GSS-API에 보안 컨텍스트를 삭제하도록 지시할 수 있다.

 

GSS-API 루틴에는 여러 유형이 있다.

 - 표준 GSS-API 루틴. 이러한 루틴은 `gss_` 접두사를 가진다.

 - GSS-API에 대한 Kerberos 확장. 이러한 추가 루틴은 응용 프로그램이 Kerberos 보안 서비스를 사용할 수 있도록 한다. 이러한 루틴은 `gss_krb5` 접두사를 가진다.


GSS-API services

Message integrity and confidentiality (메시지 무결성과 기밀성)

GSS-API는 메시지 보안 서비스를 제공한다. 기본 보안 메커니즘의 기능에 따라 메시지 무결성과 메시지 기밀성 서비스가 제공된다. 보안 컨텍스트가 설정되면, GSS-API 루틴은 해당 컨텍스트에 사용할 수 있는 메시지 보호 보안 서비스 세트를 나타내는 두개의 플래그를 반환한다.

  - `GSS_C_INTEG_FLAG`는 메시지 무결성과 출처 인증 서비스가 사용 가능한지 여부를 나타낸다.

  - `GSS_C_CONF_FLAG`는 메시지 기밀성 서비스가 사용 가능한지 여부를 나타낸다. 이 플래그는 `GSS_C_INTEG_FLAG`가 TRUE인 경우에만 TRUE가 된다.

 

메시지 보안 서비스를 원하는 GSS-API 호출자는 컨텍스트 설정 시 이러한 플래그의 값을 확인해야 하며, 반환된 값이 FALSE인 경우 `gss_get_mic()` 및 `gss_wrap()` 루틴의 호출이 사용자 데이터 메시지에 암호화 보호를 적용하지 않는 다는 점을 인지해야 한다.

 

GSS-API 메시지 무결성과 데이터 출처 인증 서비스는 수신자에게 해당 메시지가 보안 컨텍스트의 Peer에 의해 보호되었음을 보장한다. 이는 컨텍스트 설정 시 명명된 엔티티에 해당한다. GSS-API 메시지 기밀성 서비스는 송신자에게 메시지의 내용이 컨텍스트의 명명된 피어 이외의 엔티티로부터 보호된다는 것을 보장한다.

Message replay and sequencing (메시지 재생 및 순서 지정)

GSS-API는 메시지 순서 지정 및 재생 감지 서비스도 제공한다. 이러한 선택 가능한 보호 기능은 컨텍스트 설정 작업에서 제공되는 재생 감지 및 순서 지정 기능과는 별개다. 컨텍스트 수준의 재생 또는 순서 지정의 존재 여부는 기본 보안 메커니즘 계층의 기능에 따라 달라지며, 호출자 옵션으로 선택되거나 생략되지 않는다.

 

컨텐스트를 시작하는 호출자는 설정 중인 컨텍스트에서 메시지 재생 감지 및 순서 지정 기능을 사용할지 여부를 지정하기 위해 두 개의 플래그를 제공한다:

  - `GSS_C_REPLAY`는 메시지 재생 감지 서비스를 사용할지 여부를 나타낸다.

  - `GSS_C_SEQUENCE_FLAG`는 메시지 순서 지정 서비스를 사용할지 여부를 나타낸다.

 

컨텍스트 개시 시스템의 GSS-API 구현은 이러한 서비스가 메커니즘 유형의 기능으로 지원되는지 여부를 결정할 수 있다. 활성화되면, 이러한 서비스는 수신자가 GSS-API 처리를 통해 들어오는 메시지에서 중복 또는 순서가 맞지 않는 메시지를 감지했는지 여부를 나타내는 지표를 제공하기도 한다. 이러한 이벤트의 감지는 의심스러운 메시지가 수신자에게 제공되는 것을 방지하지 않는다. 의심스러운 메시지에 대한 적절한 조치는 호출자의 정책에 따라 달라진다.

 

재생 감지가 활성화된 경우, 잘 형성되고 올바르게 서명된 메시지에 대해 가능한 주요 상태 반환 값은 다음과 같다:

  - `GSS_S_COMPLETE`: 메시지가 재생 이벤트를 감지할 수 있는 시간 또는 순서 공간 내에 있으며, 해당 window 내에서 이전에 처리된 메시지의 재생이 아니다.

  - `GSS_S_DUPLICATE_TOKEN`: 수신된 메시지의 암호화 체크 값이 올바르지만, 메시지가 이전에 처리된 메시지의 중복으로 인식되었다.

  - `GSS_S_OLD_TOKEN`: 수신된 메시지의 암호화 체크 값이 올바르지만, 메시지가 너무 오래되어 중복 여부를 확인할 수 없다.

Quality of protection (보호 품질)

일부 메커니즘은 사용자에게 메시지 보호를 제공하는 수단에 대한 세밀한 제어를 제공하여, 호출자가 특정 메시지의 보호 요구 사항에 따라 동적으로 보안 처리 오버헤드를 조정할 수 있게 한다. 메시지 보호 품질(QOP) 매개변수는 해당 메커니즘이 지원하는 다양한 QOP 옵션 중에서 선택한다. 다중 QOP 메커니즘의 경우, 컨텍스트 설정 시 컨텍스트 수준 데이터가 다양한 보호 품질 범위에 대한 전제 데이터를 제공한다.

Anonymity (익명성)

특정 상황이나 환경에서는 응용 프로그램이 자신의 신원을 드러내지 않고 GSS-API 메시지 서비스를 사용하여 피어를 인증하거나 통신을 보호(또는 둘 다)하고자 할 수 있다. 일반적인 GSS-API 사용하는 컨텍스트 개시자의 신원이 컨텍스트 설정 과정의 일부로 컨텍스트 수락자에게 제공된다.

 

익명성 자원을 위해, 컨텍스트 개시자가 자신의 신원을 컨텍스트 수락자에게 제공하지 않도록 요청할 수 있는 `GSS_C_ANON_FLAG`가 제공된다. 메커니즘은 이 요청을 반드시 존중할 필요는 없지만, 호출자는 반환 플래그를 통해 요청이 존중되었는지 여부를 알 수 있다. 익명 주체로서의 인증이 반드시 컨텍스트를 설정하기 위해 자격 증명이 필요하지 않음을 의미하지는 않는다는 점에 유의해야 한다.


Error handling

각 GSS-API 루틴은 두 가지 상태 값을 반환한다:

 

주요 상태 (Major status)

주요 상태 값은 일반적인 API 오류를 나타낸다. 이는 모든 GSS-API 구현에서 동일하며, 기본 메커니즘에 의존하지 않는다.

 

부차적 상태 (Minor status)

부차적 상태 값은 보고된 오류를 더 구체적으로 정의하는 메커니즘별 오류이다. 부차적 상태 값은 GSS-API 구현 간에 이식되지 않으며, 메커니즘마다 다르다.

 

이식 가능한 응용 프로그램을 설계할 때는 주요 상태 값을 사용하여 오류를 처리해야 한다. 부차적 상태 값은 응용 프로그램을 디버그하고 사용자에게 오류 및 오류 복구 정보를 표시하는데 사용해야 한다. `gss_display_status()` 루틴은 주요 및 부차적 상태 값에 대한 출력 가능한 텍스트 문자열을 얻는 데 사용된다.

Major status values

GSS-API 루틴은 OM_uint32 함수 값으로 GSS 상태 코드를 반환한다. 이 코드들은 일반적인 API 오류를 나타내며 GSS-API 구현 간에 공통적이다. GSS 상태 코드는 루틴에서 발생한 단일 API 오류와 단일 호출 오류를 나타낸다. 추가 상태 정보는 보충 정보로 GSS 상태 코드에 포함될 수 있다. 오류는 32비트 GSS 상태 코드에 다음과 같이 인코딩된다:

GSS 상태 코드 비트 위치

 

GSS-API 루틴이 상위 16비트에 0이 아닌 값을 포함하는 GSS 상태 코드를 반환하면 호출이 실패한 것이다. 호출 오류 필드가 0이 아닌 경우, 응용 프로그램의 루틴 호출에 오류가 있음을 나타낸다. 또한, 루틴은 상태 코드의 보충 정보 필드에서 하나 이상의 비트를 설정하여 추가 정보를 나타낼 수 있다.

 

모든 GSS_S_ 심볼은 비트 필드 값이 아닌 완전한 OM_uint32 상태 코드와 동일하다.

 

주요 상태 코드 GSS_S_FAILURE는 주요 상태 코드가 없는 오류가 감지되었음을 나타낸다. 오류에 대한 자세한 내용은 부차적 상태 코드를 확인하도록 한다.

 

GSS-API는 주요 상태 값을 조작하기 위한 세가지 매크로를 제공한다:

  - `GSS_CALLING_ERROR()`

  - `GSS_ROUTINE_ERROR()`

  - `GSS_SUPPLEMENTARY_INFO()`

 

각 매크로는 GSS 상태 코드를 받아 관련 필드를 제외한 모든 필드를 마스킹한다. 예를 들어, 상태 코드에 `GSS_ROUTINE_ERROR()` 매크로를 사용하면, 루틴 오류 필드만 사용하고 호출 오류 및 보충 정보 필드의 값을 0으로 설정하여 값을 반환한다.

 

추가 매크로인 `GSS_ERROR()`는 상태 코드가 호출 또는 루틴 오류를 나타내는지 여부를 결정할 수 있게 한다. 상태 코드가 호출 또는 루틴 오류를 나타내면 매크로는 0이 아닌 값을 반환한다. 호출 또는 루틴 오류가 없으면 매크로는 0을 반환한다.

 

읽기 또는 쓰기 오류에 접근할 수 없는 경우, 오류가 반환되지 않을 수 있다. 대신, 저장 위치에 접근하려는 시도로 인해 신호가 생성될 수 있다.

Minor status values

GSS-API 루틴은 `minor_status` 매개변수를 반환하여 GSS-API 인터페이스 계층 또는 기본 보안 메커니즘 계층에서 발생한 오류를 나타낸다. 이 매개변수는 OM_uint32 값으로 표시되는 단일 오류를 포함한다. Kerberos 메커니즘의 경우, 이 값은 Kerberos `krb5_error_code` 데이터 타입과 동일하며 Kerberos 반환 코드를 포함한다. `gss_display_status()` 루틴은 부차적 상태 코드를 설명하는 표시 가능한 메시지를 생성하는데 사용된다.


Data types

Integer

GSS-API는 다음과 같은 정수 데이터 타입을 정의한다:

OM_uint32        32-bit unsigned integer

 

이 정수 데이터 타입은 GSS-API 루틴 정의에서 최소 비트 수를 보장하기 위해 사용하는 이식 가능한 데이터 타입이다.

String

많은 GSS-API 루틴은 불투명 데이터 및 문자열과 같은 연속적인 다중 바이트 데이터를 설명하는 인수와 반환 값을 사용한다. GSS-API 루틴과 응용 프로그램 간에 데이터 버퍼를 전달하기 위해 `gss_buffer_t` 데이터 타입을 사용한다. `gss_buffer_t`는 `gss_buffer_desc` 버퍼 설명자에 대한 포인터이다.

 

`gss_buffer_t` 데이터 타입은 다음과 같이 정의된다.

typedef struct gss_buffer_desc_struct {
    size_t                                   length;
    void *                                   value;
} gss_buffer_desc, *gss_buffer_t;

  - `length` 필드는 데이터의 총 바이트 수를 포함한다.

  - `value` 필드는 실제 데이터에 대한 포인터를 포함한다.

 

`gss_buffer_t` 데이터 타입을 사용할때, GSS-API 루틴은 응용 프로그램에 전달할 모든 데이터에 대한 저장소를 할당한다. 호출하는 응용프로그램은 `gss_buffer_desc` 객체를 할당할 책임이 있다. 응용 프로그램은 `GSS_C_EMPTY` 값을 사용하여 `gss_buffer_desc` 객체를 초기화한다. GSS-API 루틴이 할당한 저장소를 해제하려면, 응용 프로그램은 `gss_release_buffer()` 루틴을 호출한다. GSS-API 루틴이 다른 저장소 관리 알고리즘을 사용할 수 있으므로, 응용 프로그램은 다른 방법으로 GSS-API 루틴이 할당한 저장소를 해제하려고 시도해서는 안된다.

Object identifier (객체 식별자)

응용 프로그램은 `gss_oid` 데이터 타입을 사용하여 보안 메커니즘과 이름 유형을 지정한다.

 

다음 객체 식별자(OID)를 사용하여 보안 메커니즘을 선택한다.

 - Kerberos 보안 메커니즘: `gss_mech_krb5`를 지정한다. 이는 객체 식별자 `{1 2 840 113554 1 2 2}`에 해당한다. Kerberos 메커니즘은 개시자가 인증을 위해 Kerberos 서비스 티켓을 사용할때 사용된다. 하위 호환성을 위해, `gss_merch_krb5_old`를 지정할 수 있으며, 이는 객체 식별자 `{1 3 1 5 2}`에 해당한다. `gss_mech_krb5_old`는 DES 및 DES3 세션 키와 함께 사용할때만 유효하다.

 

다음 OID를 사용하여 이름 유형을 선택한다:

 

이름: `GCC_C_NT_USER_NAME`을 지정한다. 이는 객체 식별자 `{1 2 840 113554 1 2 1 1}`에 해당한다.

  - Kerberos 메커니즘의 경우, 사용자 이름은 Kerberos 주체의 문자 문자열 표현이며, 완전한 `principal@realm` 또는 자격이 없는 `principal`이다. 자격이 없는 주체 이름이 지정되면 로컬 realm이 추가된다.

 

서비스: `GSS_C_NT_HOSTBASED_SERVICE`를 지정한다. 이는 객체 식별자 `{1 2 840 113554 1 2 1 4}`에 해당한다.

  - Kerberos 메커니즘의 경우, 서비스는 완전한 `service@host` 또는 자격이 없는 `service`인 문자열이다. 자격이 없는 서비스 이름이 지정되면 로컬 호스트 이름이 추가된다.

  - Kerberos 메커니즘의 경우, 서비스 이름은 `service/canonical-name@kerberos-realm`으로 변환된다. 정규 이름은 제공된 호스트 이름에 대한 DNS 조회를 통해 얻어진다.

 

Kerberos 주체 이름: `gss_nt_krb5_name`을 지정한다. 이 이름 유형은 Kerberos 메커니즘에서만 지원되며 객체 식별자 `{1 2 840 113554 1 2 2 1}`에 해당한다. 이는 `GSS_C_NT_USER_NAME`과 동일하지만, 내부 이름 표현은 SPKM 및 LIPKEY 메커니즘에 대해 생성되지 않는다.

krb5_parse_name() 루틴에 의해 생성된 주체 구조: `gss_nt_krb5_principal`을 지정한다. 이 이름 유형은 Kerberos 메커니즘에서만 지원되며 객체 식별자 `{1 2 840 113554 1 2 2 2}`에 해당한다.

사용자 식별자: 문자열 표현의 UID에 대해 `GSS_C_NT_STRING_UID_NAME`을, 바이너리 표현의 UID에 대해 `GSS_C_NT_MACHINE_UID_NAME`을 지정한다. 이는 객체 식별자 `{1 2 840 113554 1 2 1 3}` 및 `{1 2 840 113554 1 2 1 2}`에 해당한다. UID는 로컬 시스템의 호스트 사용자 ID로 매핑된다. Kerberos 메커니즘의 경우, 사용자 ID는 Kerberos 주체로 추가 매핑된다.

 

`gss_OID` 데이터 타입은 ISO에 의해 정의된 트리 구조 값을 포함하여 다음과 같이 정의된다.

typedef struct gss_OID_desc_struct {
    OM_uint32                               length;
    void *                                  elements;
} gss_OID_desc, *gss_OID;

 

구조체의 `elements` 필드는 `gss_OID` 데이터 타입의 값을 포함하는 ASN.1 BER (Basic Encoding Rules) 인코딩의 첫번째 바이트를 가리킨다. `length` 필드는 값의 바이트 수를 포함한다.

 

GSS-API 루틴에 의해 반환된 `gss_OID_desc` 값은 읽기 전용 값이다. 응용 프로그램은 `gss_release_oid()` 함수를 호출하여 이를 해제하려고 시도해서는 안된다.

Object identifier sets

`gss_OID_set` 데이터 타입은 하나 이상의 객체 식별자를 나타낸다. `gss_OID_set` 데이터 타입의 값은 다음과 같은 용도로 사용된다:

 - GSS-API가 지원하는 사용 가능한 메커니즘 보고

 - 특정 메커니즘 요청

 - GSS-API 자격 증명이 지원하는 메커니즘 표시

 - GSS-API가 지원하는 사용가능한 이름 유형 보고

 

`gss_OID_set` 데이터 타입은 다음과 같이 정의된다.

typedef struct gss_OID_set_desc_struct {
    int                                      count;
    gss_OID                                  elements;
} gss_OID_set_desc, *gss_OID_set;

 - `count` 필드는 집합 내의 OID 수를 포함한다.

 - `elements` 필드는 각 OID를 설명하는 `gss_oid_desc` 객체 배열에 대한 포인터이다.

 

응용 프로그램은 GSS-API 루틴에 의해 반환된 `gss_OID_set` 값과 관련된 저장소를 해제하기 위해 `gss_release_oid_set()` 루틴을 호출한다.

Credentials (자격 증명)

자격 증명은 응용 프로그램 또는 다른 주체의 신원을 설정하거나 증명한다. `gss_cred_id_t`는 GSS-API 자격 증명 데이터 구조를 식별하는 원자적 데이터 타입이다. 이 데이터 타입은 호출자에게 불투명하다. 자격 증명 식별자는 자격 증명을 획득한 프로세스 내에서만 유효하다.

Contexts

Security Context는 통신하는 응용 프로그램 간에 공유되는 정보를 포함하는 GSS-API 데이터 구조 쌍이다. 이 정보는 각 응용프로그램의 상태를 설명한다. 이 security context는 메시지별 보안 서비스에 필요하며, 성공적인 authentication exchange에 의해 생성된다. `gss_ctx_id_t` 데이터 타입은 GSS-API security context의 한 쪽 끝을 식별하는 원자적 값을 포함한다. 이 데이터 타입은 호출자에게 불투명하다. context identifier는 security context를 초기화하거나 수락한 프로세스 내에서만 유효하다.

Tokens

GSS-API는 security context를 공유하는 통신 응용 프로그램 간의 동기화를 유지하기 위해 tokens를 사용한다. token은 암호화로 보호된 octet string이다. 이 문자열은 GSS-API security context의 한 쪽 끝에서 기본 보안 메커니즘에 의해 생성되어 security context의 다른 쪽 끝에 있는 피어 응용 프로그램에서 사용된다. 이 데이터 타입은 호출자에게 불투명 한다. 호출자는 `gss_buffer_t` 데이터 타입을 GSS-API 루틴의 tokens로 사용한다.

 

GSS-API는 두가지 유형의 tokens를 사용한다. Context-level tokens는 통신 응용 프로그램 간의 security context를 설정하는데 사용된다. Per-message tokens는 응용 프로그램이 교환하는 메시지에 대해 무결성과 기밀성 서비스를 제공하는데 사용된다.

Names

Names는 주체(principals)를 식별한다. GSS-API는 이름과 그 이름을 주장하는 주체 간의 관계를 인증하다.

 

Names는 두가지 형태로 표현된다:

 - 응용 프로그램에 표시하기 위한 출력 가능한 형태

 - GSS-API에서 사용되는 내부 정규 형태로, 응용 프로그램에는 불투명하다.

 

`gss_import_name()` 및 `gss_display_name()` 루틴은 names를 출력 가능한 형태와 내부 형태 간에 변환한다. 각 보안 메커니즘은 고유한 이름 형식을 가지고 있다. `gss_import_name()` 루틴은 지원되는 각 보안 메커니즘에서 사용할 수 있도록 제공된 이름의 내부 표현을 생성한다. 특정 보안 메커니즘에 의해 생성된 내부 이름은 해당 보안 메커니즘에 대한 내부 표현만을 포함한다. `gss_compare_name()` 루틴은 두 이름을 내부 형식으로 비교하는데 사용할 수 있다.

Channel bindings

channel bindings를 정의하고 사용하여 security context를 해당 context를 전달하는 통신 채널과 연관시킬 수 있다. Channel bindings는 다음 구조체를 사용하여 GSS-API에 전달된다.

typedef struct gss_channel_binding_struct {
    OM_uint32                                initiator_addrtype;
    gss_buffer_desc                          initiator_address;
    OM_uint32                                acceptor_addrtype;
    gss_buffer_desc                          acceptor_address;
    gss_buffer_desc                          application_data;
} gss_channel_bindings_desc, *gss_channel_bindings_t;

 

`initiator_addrtype` 및 `acceptor_addrtype` 필드를 사용하여 `initiator_address` 및 `acceptor_address` 버퍼에 포함된 주소의 유형을 나타낸다. 다음 표는 주소 유형과 해당 주소 유형 값을 나타낸다.

 

태그는 주소 형식이 아닌 주소 패밀리를 지정한다. 여러 대체 주소 형식을 포함하는 주소 패밀리의 경우, `initiator_address` 및 `acceptor_address` 필드에는 사용 중인 주소 형식을 결정할 수 있는 충분한 정보가 포함되어야 한다. 주소를 포함하는 바이트는 네트워크를 통해 바이트가 전송되는 순서대로 형식화해야 한다.

 

GSS-API는 `gss_channel_bindings_desc` 데이터 구조의 모든 필드를 연결하여 octet string을 생성한다. 보안 메커니즘은 이 octet string에 서명하고, 서명을 `gss_init_sec_context()` 루틴에 의해 생성된 토큰에 바인딩한다. 컨텍스트 수락자는 동일한 바인딩을 `gss_accept_sec_context()` 루틴에 제시하며, 이 루틴은 자체 서명을 생성하고 이를 토큰의 서명과 비교한다. 서명이 다르면 `gss_accept_sec_context()` 루틴은 `GSS_S_BAD_BIDNINGS` 오류를 반환하고 컨텍스트가 설정되지 않는다.

 

일부 보안 메커니즘은 `gss_init_sec_context()` 루틴에 제시된 channel bindings의 `initiator_address` 필드에 로컬 시스템의 올바른 네크워크 주소가 포함되어 있는지 확인한다. 따라서 이식 가능한 응용 프로그램은 올바른 주소 유형과 값을 사용하거나 `initiator_addrtype` 필드에 `GSS_C_AF_NULLADDR`를 지정해야 한다. 일부 보안 메커니즘은 서명 대신 채널 바인딩 데이터를 토큰에 포함하므로, 이식 가능한 응용 프로그램은 기밀 데이터를 채널 바인딩 구성 요소로 사용해서는 안된다. kerberos GSS-API는 주소를 확인하지 않으며, 평문 바인딩 정보를 토큰에 포함하지 않는다.

Optional parameters

일부 루틴 설명에서는 응용 프로그램이 매개변수에 기본 값을 전달하여 기본 동작을 요청할 수 있도록 선택적 매개변수를 허용한다. 선택적 매개변수에 대한 규칙은 다음 표에 나와있다.

gss_buffer_t data types GSS_NO_BUFFER
Output integer data types NULL
OID data types GSS_C_NO_OID
OID set data types GSS_C_NO_OID_SET
Credential data types GSS_C_NO_CREDENTIAL
Context data types GSS_C_NO_CONTEXT
Channel bindings data types GSS_C_NO_CHANNEL_BINDINGS
Name data types GSS_C_NO_NAME
Empty buer descriptor initialization GSS_C_EMPTY_BUFFER

GSS-API programming interfaces

이 장에서는 GSS-API 프로그래밍 인터페이스를 알파벳 순서로 나열하고 각 인터페이스의 목적, 형식, 매개변수, 사용 방법 및 상태 코드에 대한 정보를 제공한다.

gss_accept_sec_context (accept a security context)

Purpose

컨텍스트 개시자가 생성한 보안 컨텍스트를 수락한다.

Format

#include <skrb/gssapi.h>
OM_uint32 gss_accept_sec_context (
    OM_uint32 *              minor_status,
    gss_ctx_id_t *           context_handle,
    gss_cred_id_t            acceptor_cred_handle,
    gss_buffer_t             input_token,
    gss_channel_bindings_t   input_chan_bindings,
    gss_name_t *             src_name,
    gss_OID *                mech_type,
    gss_buffer_t             output_token,
    gss_flags_t *            ret_flags,
    OM_uint32 *              time_rec,
    gss_cred_id_t *          delegated_cred_handle)

Input Parameters

acceptor_cred_handle

컨텍스트 수락자가 주장하는 신원에 대한 GSS-API 자격 증명을 지정한다. 자격 증명은 ACCEPT 유형 자격 증명 또는 BOTH 유형 자격 증명이어야 한다. 

 

input_token

컨텍스트 개시자로부터 받은 토큰을 지정한다.

 

input_chan_bidings

통신 응용 프로그램 간에 사용되는 통신 채널을 설명하는 바인딩을 지정한다. 컨텍스트 수락자가 지정한 채널 바인딩은 입력 토큰이 생성될때 컨텍스트 개시자가 지정한 바인딩과 일치해야 한다. 채널 바인딩이 없는 경우 `GSS_C_NO_CHANNEL_BINDINGS`를 지정한다.

Input/Output Parameters

context_handle

컨텍스트에 대한 컨텍스트 핸들을 지정한다. 컨텍스트 수락자가 `gss_accept_sec_context()` 루틴을 처음 호출할 때, 컨텍스트 핸들 값은 `GSS_C_NO_CONTEXT`로 설정해야 한다. 컨텍스트 설정을 계속하기 위한 후속 호출에서는 이전에 `gss_accept_sec_context()` 루틴 호출에서 반환된 값을 컨텍스트 핸들로 사용해야 한다.

Output Parameters

src_name

컨텍스트 개시자의 인증된 이름을 반환한다. 인증된 이름이 필요하지 않은 경우 이 매개변수에 `NULL`을 지정한다. 변환된 이름은 반환된 플래그에 `GSS_C_ANON_FLAG`가 설정된 경우 익명의 내부 이름이다. 더이상 필요하지 않으면 `gss_release_name()` 루틴을 호출하여 이름을 해제해야 한다.

 

mech_type

컨텍스트가 설정된 보안 메커니즘을 반환한다. 보안 메커니즘 유형이 필요하지 않은 경우 이 매개변수에 `NULL`을 지정한다. 이 매개변수에 대해 반환된 `gss_OID` 값은 읽기 전용 구조체를 가리키며, 응용 프로그램에서 해제해서는 안된다. 변환된 보안 메커니즘은 다음 중 하나이다:

  - `gss_mech_krb5_old`: Beta Kerberos V5 메커니즘

  - `gss_mech_krb5`: Kerberos V5 메커니즘

 

output_token

컨텍스트 개시자에게 반환할 토큰을 반환한다. 컨텍스트 개시자에게 저달할 토큰이 없는 경우, `gss_accept_sec_context()` 루틴은 `output_token` 길이 필드를 0으로 설정한다. 그렇지 않으면, `output_token` 길이 및 값 필드는 0이 아닌 값으로 설정된다. 더이상 필요하지 않으면 `gss_release_buffer()` 루틴을 호출하여 출력 토큰을 해제해야 한다. 

 

ret_flags

개시 응용 프로그램이 요청한 서비스를 나타내는 독립 플래그를 포함하는 비트 마스크를 반환한다. 플래그 값이 필요하지 않은 경우 이 매개변수에 `NULL`을 지정한다. 개별 플래그를 테스트하기 위해 다음과 같은 기호 정의가 제공되며, 서비스 옵션을 지원하는지 테스트하기 위해 `ret_flags` 값과 논리적으로 AND해야 한다.

 - `GSS_C_DELEG_FLAG`: 이 플래그가 TRUE인 경우, 위임된 자격 증명이 사용가능하다.

 - `GSS_C_MUTUAL_FLAG`: 이 플래그가 TRUE인 경우 상호 인증이 필요하다.

 - `GSS_C_REPLAY_FLAG`: 이 플래그가 TRUE인 경우 재생된 서명 또는 봉인된 메시지가 감지된다.

 - `GSS_C_SEQUENCE_FLAG`: 이 플래그가 TRUE인 경우 순서가 맞지 않는 서명 또는 봉인된 메시지가 감지된다.

 - `GSS_C_CONF_FLAG`: 이 플래그가 TRUE인 경우 기밀성 서비스가 사용 가능하다.

 - `GSS_C_INTEG_FLAG`: 이 플래그가 TRUE인 경우 무결성 서비스가 사용 가능하다.

 - `GSS_C_ANON_FLAG`: 이 플래그가 TRUE인 경우 익명 서비스가 사용 가능하다. `src_name` 매개변수는 익명의 내부 이름을 반환한다.

 - `GSS_C_PROT_READY_FLAG`: 이 플래그가 TRUE인 경우, 동반 주요 상태가 `GSS_S_COMPLETE` 또는 `GSS_S_CONTINUE_NEEDED`인 경우 지정된 보호 서비스(`GSS_C_CONF_FLAG` 및 `GSS_C_INTEG_FLAG`)가 사용 가능하다. 그렇지 않으면, 보호 서비스는 동반 주요 상태가 `GSS_S_COMPLETE`인 경우에만 사용 가능하다.

 - `GSS_C_TRANS_FLAG`: 이 플래그가 설정된 경우, `gss_export_sec_context()` 함수를 사용하여 보안 컨텍스트를 내보낼 수 있다. 이 플래그가 설정되지 않은 경우 `gss_export_sec_context()` 함수는 사용할 수 없다.

 

time_rec

컨텍스트가 더이상 유효하지 않기까지 남은 시간을 초단위로 반환한다. 메커니즘이 자격 증명 만료를 지원하지 않는 경우 반환 값은 `GSS_C_INDEFINITE`이다. 남은 시간이 필요하지 않은 경우 이 매개변수에 `NULL`을 지정한다.

 

delegated_cred_handle

컨텍스트 개시자로부터 받은 위임된 자격 증명에 대한 자격 증명 핸들을 반환한다. 위임된 자격 증명이 필요하지 않은 경우 이 매개변수에 `NULL`을 지정한다. 자격 증명 핸들은 반환된 플래그에 `GSS_C_DELEG_FLAG` 플래그가 설정된 경우에만 반환된다. 반환된 자격 증명은 `gss_init_sec_context()` 루틴을 호출하여 새 보안 컨텍스트를 시작하는데 사용할 수 있다. 더 이상 필요하지 않으면 `gss_release_cred()` 루틴을 호출하여 반환된 자격 증명을 해제해야 한다.

 

minor_status

보안 메커니즘에서 상태코드를 반환한다.

사용법

`gss_accept_sec_context()` 루틴은 컨텍스트 개시자와 컨텍스트 수락자 간의 보안 컨텍스트를 설정하는 두번째 단계다.

  - 첫번째 단계에서는 컨텍스트 개시자가 `gss_init_sec_context()` 루틴을 호출하여 보안 컨텍스트에 대한 토큰을 반환한다. 그런 다음 컨텍스트 개시자는 이 보안 토큰을 컨텍스트 수락자에게 전달한다.

  - 두번째 단계에서는 컨텍스트 수락자가 컨텍스트 개시자가 제공한 토큰을 받아 `gss_accept_sec_context()` 루틴을 호출하여 컨텍스트를 수락한다.

 

Kerberos 보안 서버가 응용 프로그램과 동일한 시스템에서 실행되는 경우, 키 테이블을 제공할 필요가 없다. 대신, GSS-API는 Kerberos 보안 서버의 로컬 인스턴스를 사용하여 티켓을 해독한다. 이 지원을 활성화하려면 `KRB5_SERVER_KEYTAB` 환경 변수를 다음 값 중 하나로 설정하고, 설정된 값에 따라 다음 요구 사항을 충족해야 한다:

 

`KRB5_SERVER_KEYTAB` 환경변수가 1로 설정된 경우:

 - 응용 프로그램은 FACILITY 클래스의 `IRR.RUSERMAP` 리소스에 대해 최소한 READ 액세스 권한을 가진 사용자 또는 그룹으로 실행되어야 한다.

 - 현재 시스템 신원과 연결된 Kerberos 주체는 GSS-API 자격 증명의 주체와 일치해야 한다.

 

`KRB5_SERVER_KEYTAB` 환경변수가 2로 설정된 경우:

  - 현재 시스템 신원은 티켓의 서버 주체와 일치하는 Kerberos 주체를 가지고 있거나, KERBLINK 클래스에서 티켓의 서버 주체에 대해 최소한 READ 액세스 권한을 가지고 있어야 한다.

 

`output_token`의 길이 값이 0이 아닌 경우, 컨텍스트 수락자는 반환된 토큰을 컨텍스트 개시자에게 전달해야 한다. 그런 다음 컨텍스트 개시자는 `gss_init_sec_context()`를 호출하고, 원래 `gss_init_sec_context()` 호출에서 반환된 컨텍스트 식별자와 컨텍스트 수락자가 반환한 출력 토큰을 지정해야 한다.

 

컨텍스트 설정을 완료하려면 피어 응용 프로그램에서 하나 이상의 응답 토큰이 필요할 수 있다. 이 경우, `gss_accept_sec_context()`는 `GSS_S_CONTIBUE_NEEDED` 상태 플래그를 반환하며, 이 경우 피어 응용 프로그램에서 응답 토큰을 받을때 다시 호출해야 하며, `input_token` 매개변수를 통해 토큰을 `gss_accept_sec_context()`에 전달해야 한다.

 

기밀성 서비스의 사용 가능 여부는 기본 보안 메커니즘과 시스템에 설치된 기능에 따라 다르다. `GSS_C_CONF_FLAG`는 로컬 및 원격 시스템 모두에서 기밀성 서비스가 사용 가능한 경우에만 반환된다. 원격 시스템에서 기밀성 서비스가 사용가능하지만 로컬 시스템에서 사용 불가능한 경우, 암호화된 메시지가 수신되면(`gss_wrap()` 루틴 호출 시 원격 시스템에서 기밀성이 요청된 경우) `gss_unwrap()` 루틴에서 오류가 반환된다.

 

`GSS_S_CONTINUE_NEEDED` 상태 플래그가 설정된 경우, 컨텍스트가 완전히 설정되지 않았으며 다음 제한 사항이 출력 매개변수에 적용된다:

 - `time_rec` 매개변수가 반환하는 값은 정의되지 않는다.

 - 동반 `ret_flags` 매개변수가 메시지별 서비스가 성공적인 완료 상태 전에 적용될 수 있음을 나타내는 `GSS_C_PROT_READY_FLAG` 비트를 포함하지 않는 한, `mech_type` 매개변수가 반환하는 값은 루틴이 `GSS_S_COMPLETE` 주요 상태를 반환할 때까지 정의되지 않을 수 있다.

 - `ret_flags` 매개변수를 통해 반환된 `GSS_C_DELEG_FLAG`, `GSS_C_MUTUAL_FLAG`, `GSS_C_REPLAY_FLAG`, `GSS_C_SEQUENCE_FLAG`, `GSS_C_CONF_FLAG`, `GSS_C_INTEG_FLAG`, `GSS_C_ANON_FLAG` 비트의 값은 컨텍스트 설정이 성공할 경우 유효할 것으로 예상되는 값을 포함한다.

 - `ret_flags` 매개변수를 통해 반환된 `GSS_C_PROT_READY_FLAG` 비트의 값은 컨텍스트가 완전히 설정되었는지 여부에 관계없이 `gss_accept_sec_context()`가 반환될때의 실제 상태를 나타낸다.

Kerberos 메커니즘

`gss_accept_sec_context()` 루틴은 컨텍스트 개시자가 제공한 토큰을 해독하기 위해 키가 필요하다. 토큰에는 컨텍스트 수락자의 암호화되지 않은 주체 이름이 포하되어 있다. 이 이름은 컨텍스트 개시자가 토큰을 암호화하는데 사용한 키를 식별하낟. 기본 키 테이블은 지정된 주체에 대한 키를 얻는데 사용된다. `KRB5_KTNAME` 환경변수를 설정하여 다른 키 테이블을 사용할 수 있다.

 

컨텍스트 만료 시간은 `gss_init_sec_context()` 처리의 일부로 컨텍스트 개시자가 얻은 서비스 티켓에서 얻는다.

 

위임이 사용되는 경우, 전달된 Kerberos 자격 증명은 delegated_cred_handle` 매개변수에 대해 반환된 GSS-API 자격 증명과 연결된 새 Kerberos 자격 증명 캐시에 저장된다. 이 GSS-API 자격 증명은 원래 컨텍스트 개시자를 대신하여 새 보안 컨텍스트를 시작하는데 사용할 수 있다.

상태 코드

상태 코드 의미
`GSS_S_COMPLETE` 루틴이 성공적으로 완료되었다.
`GSS_S_BAD_BINDINGS` `input_token` 매개변수에 `input_chan_bindings` 매개변수로 지정된 것과 다른 채널 바인딩이 포함되어 있다.
`GSS_S_BAD_MECH` 컨텍스트 개시자가 사용한 보안 메커니즘이 수락자 시스템에서 사용할 수 없다.
`GSS_S_BAD_SIG` 수신된 입력 토큰에 잘못된 서명이 포함되어 있다.
`GSS_S_CONTINUE_NEEDED` 반환된 출력 토큰의 제어 정보를 개시자에게 보내야 하며, 응답을 받아 `gss_accept_sec_context()` 루틴의 계속 호출에 `input_token` dlstnfh wjsekfgodi gksek.
`GSS_S_CREDENTIALS_EXPIRED` 자격 증명이 더이상 유효하지 않다.
`GSS_S_DEFECTIVE_CREDENTIAL` `verifier_cred_handle` 매개변수로 참조된 자격 증명 구조에 대해 수행된 일관성 검사에 실패했다.
`GSS_S_DEFECTIVE_TOKEN` 입력 토큰에 대해 수행된 일관성 검사에 실패했다.
`GSS_S_DUPLICATE_TOKEN` 토큰이 이미 처리된 토큰의 중복이다. 이는 컨텍스트 설정 중 치명적인 오류다.
`GSS_S_FAILURE` 루틴이 GSS 수준에서 정의되지 않은 이유로 실패했다. `minor_status` 반환 매개변수에는 실패 이유를 설명하는 메커니즘 종속 오류 코드가 포함되어 있다.
`GSS_S_NO_CONTEXT` 호출자가 제공한 컨텍스트 식별자가 유효한 보안 컨텍스트를 참조하지 않는다.
`GSS_S_NO_CRED` 사용할 수 있는 자격 증명이 없거나 자격 증명이 컨텍스트 개시 용도로만 유효하다.
`GSS_S_OLD_TOKEN` 토큰이 이전 토큰과의 중복 여부를 확인하기에는 너무 오래되었다. 이는 컨텍스트 설정 중 치명적인 오류다.

gss_acquire_cred (GSS-API 자격 증명 획득)

응용프로그램이 GSS-API 자격 증명을 획득할 수 있도록 한다.

#include <skrb/gssapi.h>
OM_uint32 gss_acquire_cred (
    OM_uint32 *              minor_status,
    gss_name_t               desired_name,
    OM_uint32                time_req,
    gss_OID_set              desired_mechs,
    gss_cred_usage_t         cred_usage,
    gss_cred_id_t *          output_cred_handle,
    gss_OID_set *            actual_mechs,
    OM_uint32 *              time_rec)

Input Paramter

desired_name

자격 증명에 사용할 주체 이름을 지정한다. 기본 자격 증명 캐시에서 이름을 가져오려면 이 매개변수에 `GSS_C_NO_NAME`을 지정한다.

 

time_req

자격 증명이 유효한 시간을 초 단위로 지정한다. 최대 자격 증명 수명을 요청하려면 `GSS_C_INDEFINITE`를 지정한다. 기본 수명인 2시간을 지정하려면 0을 지정한다. Kerberos 메커니즘의 경우, 실제 자격 증명 수명은 `GSS_C_INITATE` 및 `GSS_C_BOTH` 자격 증명에 대한 기본 티켓-그랜팅 티켓의 수명에 의해 제한된다. 

 

desired_mechs

자격 증명에 사용할 보안 메커니즘을 지정한다. 로컬 시스템에서 사용할 수 없는 메커니즘은 무시된다. 자격 증명에 사용할 수 있는 실제 메커니즘은 `actual_mechs` 매개변수에 반환된다. 기본 메커니즘인 `gss_mech_krb5`를 사용하려면 이 매개변수에 `GSS_C_NO_OID_SET`을 지정한다. (e.g., gss_mech_krb5 - Kerberos V5 메커니즘. 소스와 대상은 Kerberos 티켓을 사용하여 인증된다)

 

cred_usage

자격 증명의 사용 용도를 다음과 같이 지정한다.

 - GSS_C_INITIATE: 자격 증명이 보안 컨텍스트를 시작하는 데만 사용할 수 있는 경우

 - GSS_C_ACCEPT: 자격 증명이 보안 컨텍스트를 수락하는 데만 사용할 수 있는 경우

 - GSS_C_BOTH: 자격 증명이 보안 컨텍스트를 시작하고 수락하는 데 모두 사용할 수 있는 경우

Output Parameter

output_cred_handle

GSS-API 자격 증명에 대한 핸들을 반환한다.

 

actual_mechs

자격 증명이 유효한 메커니즘 식별자 집합을 반환한다. 실제 메커니즘이 필요하지 않은 경우 이 매개변수에 `NULL`을 지정한다. 이 매개변수에 대해 반환된 `gss_OID_set`은 더이상 필요하지 않을 때 `gss_release_oid_set()` 루틴을 호출하여 해제해야 한다.

 

time_rec

자격 증명이 유효한 시간을 초 단위로 반환한다. 남은 시간이 필요하지 않은 경우 이 매개변수에 `NULL`을 지정한다.

 

minor_status

보안 메커니즘에서 상태 코드를 반환한다.

사용법

`gss_acquire_cred()` 루틴은 응용 프로그램이 GSS-API 자격 증명을 획득할 수 있도록 한다. 그런 다음 응용 프로그램은 이 자격 증명을 `gss_init_sec_context()` 및 `gss_accept_sec_context()` 루틴과 함께 사용할 수 있다.


gss_process_context_token (process a context token)

파트너 응용 프로그램으로부터 받은 컨텍스트 토큰을 처리한다.

#include <skrb/gssapi.h>
OM_uint32 gss_process_context_token (
    OM_uint32 *             minor_status,
    gss_ctx_id_t            context_handle,
    gss_buffer_t            input_token)

Input Parameter

context_handle

토큰을 처리할 때 사용할 컨텍스트를 지정한다.

 

input_token

파트너 응용 프로그램으로부터 받은 토큰을 지정한다.

Ouput Parameter

minor_status

보안 메커니즘에서 상태 코드를 반환한다.

사용법

`gss_process_context_token()` 루틴은 파트너 응용 프로그램에 의해 생성된 토큰을 처리한다. 토큰은 일반적으로 컨텍스트 설정 또는 메시지 보안 서비스와 관련이 있다. 토큰이 컨텍스트 설정과 관련이 있는 경우, `gss_init_sec_context()` 및 `gss_accept_sec_context()` 루틴에 의해 처리된다. 토큰이 메시지 보안 서비스와 관련이 있는 경우, `gss_verify_mic()` 및 `gss_unwrap()` 루틴에 의해 처리된다. 그러나 `gss_delete_sec_context()` 루틴에 의해 생성된 토큰은 `gss_process_context_token()` 루틴에 의해 처리된다.

상태 코드

상태 코드 의미
`GSS_S_COMPLETE` 루틴이 성공적으로 완료되었다.
`GSS_S_BAD_SIG` 토큰 서명이 올바르지 않다.
`GSS_S_DEFECTIVE_TOKEN` 입력 토큰에 대해 수행된 일관성 검사에 실패했다.
`GSS_S_FAILURE` 루틴이 GSS 수준에서 정의되지 않은 이유로 실패했다. `minor_status` 반환 매개변수에는 실패 이유를 설명하는 메커니즘 종속 오류 코드가 포함되어 있다.
`GSS_S_NO_CONTEXT` 컨텍스트 핸들이 유효한 보안 컨텍스트를 참조하지 않는다.

gss_unwrap (unwrap and verify a message)

`gss_wrap()` 루틴에 의해 봉인된 메시지를 풀고 내장된 서명을 검증한다.

#include <skrb/gssapi.h>
OM_uint32 gss_unwrap (
    OM_uint32 *               minor_status,
    gss_ctx_id_t              context_handle,
    gss_buffer_t              input_message,
    gss_buffer_t              output_message,
    int *                     conf_state,
    gss_qop_t *               qop_state)

Input Parameters

context_handle

메시지가 도착한 컨텍스트를 지정한다.

 

input_message

`gss_wrap()` 루틴에 의해 생성된 sealed message 을 지정한다.

Ouput Parameters

output_message

봉인 해제된 메시지를 반환한다.

 

conf_state

메시지에 적용된 기밀성 수준을 반환한다. 기밀성 상태가 필요하지 않은 경우 이 매개변수에 `NULL`을 지정한다. 반환 값은 다음과 같다:

 - `TRUE`: 기밀성과 무결성 서비스가 모두 적용된다.

 - `FALSE`: 무결성 서비스만 적용되었다.

 

qop_state

메시지에 적용된 보호 품질을 반환한다. 보호 품질이 필요하지 ㅇ낳은 경우 이 매개변수에 `NULL`을 지정한다.

 

minor_status

보안 메커니즘에서 상태 코드를 반환한다.

사용법

`gss_unwrap()` 루틴은 `gss_wrap()` 루틴에 의해 생성된 sealed token에서 메시지를 추출하고 내장된 서명을 검증한다. `conf_state` 반환 매개변수는 메시지가 암호화되었는지 여부를 나타낸다.

상태 코드

상태 코드 의미
GSS_S_COMPLETE 루틴이 성공적으로 완료되었다.
GSS_S_BAD_SIG 토큰 서명이 올바르지 않다.
GSS_S_CONTEXT_EXPIRED 참조된 컨텍스트가 만료되었다.
GSS_S_CREDENTIALS_EXPIRED 참조된 컨텍스트와 관련된 자격 증명이 만료되었다.
GSS_S_DEFECTIVE_TOKEN 입력 토큰에 대해 수행된 일관성 검사에 실패했다.
GSS_S_DUPLICATE_TOKEN 토큰이 이미 처리된 토큰의 중복이다.
GSS_S_FAILURE 루틴이 GSS 수준에서 정의되지 않은 이유로 실패했다. `minor_status` 반환 매개변수에는 실패 이유를 설명하는 메커니즘 종속 오류 코드가 포함되어 있다.
GSS_S_GAP_TOKEN 하나 이상의 선행 토큰이 처리되지 않는다.
GSS_S_NO_CONTEXT 참조된 컨텍스트가 유효하지 않다.
GSS_S_OLD_TOKEN 토큰이 너무 오래되어 이미 처리된 토큰과의 중복 여부를 확인할 수 없다.
GSS_S_UNSEQ_TOKEN 나중에 처리된 토큰이 이미 처리되었다.

gss_wrap (sign and encrypt a message)

메시지를 암호화 서명하고 선택적으로 암호화한다.

#include <skrb/gssapi.h>
OM_uint32 gss_wrap (
    OM_uint32 *        minor_status,
    gss_ctx_id_t       context_handle,
    int                conf_req_flag,
    gss_qop_t          qop_req,
    gss_buffer_t       input_message,
    int *              conf_state,
    gss_buffer_t       output_message)

Input Parameters

context_handle

메시지가 파트너 응용 프로그램으로 전송될때 연관될 컨텍스트를 지정한다.

 

conf_req_flags

요청된 기밀성과 무결성 서비스 수준을 지정한다:

  - `TRUE`: 기밀성과 무결성 서비스가 모두 요청된다.

  - `FALSE`: 무결성 서비스만 요청된다.

 

qop_req

메시지에 대해 요청된 보호 품질을 지정한다. 선택된 보안 메커니즘에 의해 정의된 기본 보호 품질을 사용하려면 `GSS_C_QOP_DEFAULT`를 지정한다. 특정 보호 품질 알고리즘을 선택해야 하는 경우, 응용 프로그램은 선택한 알고리즘이 보안 컨텍스트와 연관된 보안 메커니즘과 호환되는지 확인해야 한다. 보호 품질 값은 무결성 알고리즘 값 중 하나와 봉인 알고리즘 값 중 하나를 OR 연산하여 형성된다. 무결성 및 봉인 알고리즘 값에 대한 자세한 내요은 사용법 섹션에서 선택한 보안 메커니즘을 참고한다.

 

input_message

봉인할 메시지를 지정한다.

Output Parameters

conf_state

메시지에 적용된 기밀성 수준을 반환한다. 기밀성 상태가 필요하지 않은 경우 이 매개변수에 `NULL`을 지정한다. 반환 값은 다음과 같다:

  - `TRUE`: 기밀성과 무결성 서비스가 모두 적용되었다.

  - `FALSE`: 무결성 서비스만 적용되었다.

 

output_message

봉인된 메시지를 반환한다. 더이상 필요하지 않으면 `gss_release_buffer()` 루틴을 호출하여 버퍼를 해제해야 한다.

 

minor_status

보안 메커니즘에서 상태 코드를 반환한다.

사용법

`gss_wrap()` 루틴은 메시지를 암호화 서명하고 선택적으로 암호화한다. `output_message` 매개변수에 반환된 토큰에는 서명과 메시지가 모두 포함된다. 그런 다음 이 토큰은 파트너 응용 프로그램으로 전송되며, 파트너 응용 프로그램은 `gss_unwrap()` 루틴을 호출하여 원본 메시지를 추출하고 그 진위성을 확인한다.

 

기밀성이 요청되었지만(`conf_req_flag`가 TRUE) 보안 컨텍스트에 대해 기밀성 서비스가 사용 불가능한 경우, 오류는 반환되지 않으며 무결성 서비스만 수행된다. `conf_state` 반환 매개변수는 요청된 기밀성 서비스가 수행되었는지 여부를 나타낸다. 강력한 암호화 알고리즘은 정부의 수출 규제로 인해 특정 시스템에서 사용할 수 없을 수 있다. `gss_get_qop_list()` 루틴을 호출하여 보안 컨텍스트에 대해 지원되는 무결성과 기밀성 알고리즘 목록을 얻을 수 있다.

Kerberos 메커니즘

Kerberos 메커니즘의 버전 2는 보호 품질 매개변수의 명시를 더 이상 사용하지 않으며, 지정된 값을 무시하고 `GSS_C_QOP_DEFAULT` 동작을 수행한다. Kerberos 메커니즘의 버전 1은 DES 및 DES3만 지원하므로, 하위 호환성을 위해 IBM은 세션 키가 DES 또는 DES3인 경우 버전 1을 사용하고, 다른 암호화 유형의 경우 버전 2를 사용한다.

 

Kerberos 무결성 알고리즘은 다음과 같다:

 - `GSS_KRB5_INTEG_C_QOP_DEFAULT`: 기본 무결성 알고리즘 `gss_init_sec_context` 호출 중에 선택된 무결성 알고리즘을 사용한다. 이는 DES 세션 키의 경우 DES 암호화된 MD5 체크섬이거나, DESD, DES3, AES128 또는 AES256 세션 키의 경우 암호화된 HMAC_SHA1 체크섬이다.

 - `GSS_KRB5_INTEG_C_QOP_MD5`: 잘린 MD5 체크섬

 - `GSS_KRB5_INTEG_C_QOP_DES_MD5`: DES 암호화된 MD5 체크섬

 - `GSS_KRB5_INTEG_C_QOP_DES_MAC`: DES-MAC 체크섬

 - `GSS_KRB5_INTEG_C_QOP_HMAC_SHA1`: HMAC-SHA1 체크섬

 

Kerberos 기밀성 알고리즘은 다음과 같다:

 - `GSS_KRB5_CONF_C_QOP_DEFAULT`: 기본 기밀성 알고리즘

 - `GSS_KRB5_CONF_C_QOP_DES`: 56비트 DES 암호화

 - `GSS_KRB5_CONF_C_QOP_DES3_KD`: 키 파생이 있는 168비트 DES3 암호화

 

보안 컨텍스트와 연관된 암호화 키는 사용할 수 있는 보호 품질 알고리즘을 결정한다. 기본 알고리즘은 `GSS_C_QOP_DEFAULT`를 지정하여 요청할 수 있으며, 이는 GSS_KRB5_INTEG_C_QOP_DEFAULT | GSS_KRB5_CONF_C_QOP_DEFAULT를 지정하는 것과 동일하다.

상태 코드

상태 코드 의미
GSS_S_COMPLETE 루틴이 성공적으로 완료되었다.
GSS_S_BAD_QOP 보호 품질 값이 유효하지 않다.
GSS_S_CONTEXT_EXPIRED 참조된 컨텍스트가 만료되었다.
GSS_S_CREDENTIALS_EXPIRED 참조된 컨텍스트와 관련된 자격 증명이 만료되었다.
GSS_S_FAILED 루틴이 GSS 수준에서 정의되지않은 이유로 실패했다. `minor_status` 반환 매개변수에는 실패 이유를 설명하는 메커니즘 종속 오류 코드가 포함되어 있다.
GSS_S_NO_CONTEXT 참조된 컨텍스트가 유효하지 않다.