2.5. Elytron 인증 정보 저장소 사용
Fuse에는 JBoss EAP의 일부인 Elytron 자격 증명 저장소 기능이 포함되어 있습니다. 인증 정보 저장소는 스토리지 파일에서 암호화하여 중요한 텍스트 문자열을 안전하게 보호할 수 있습니다. 각 컨테이너에는 정확히 하나의 인증 정보 저장소가 있을 수 있습니다.
보안 구성에서 일반적인 문제는 암호를 저장하는 방법입니다. 예를 들어 다양한 애플리케이션에서 데이터베이스 액세스에 대한 암호를 고려하십시오. 여러 인증 방법의 경우 서버가 데이터베이스 서버에 자격 증명을 보내기 전에 암호를 일반 텍스트로 사용할 수 있어야 합니다. 일반적으로 텍스트 구성 파일에 일반 텍스트 암호를 저장하는 것은 좋지 않습니다.
Elytron 인증 정보 저장소는 이 문제를 해결합니다. PKCS#12 사양을 준수하는 암호화된 파일인 인증 정보 저장소에 암호 및 기타 중요한 값을 안전하게 저장합니다. 인증 정보 저장소는 암호화되지 않은 값을 저장하지 않습니다. 인증 정보 저장소는 PBE(암호 기반 암호화)를 사용하여 암호와 저장소 자체와 같은 중요한 값을 모두 암호화합니다.
다음 주제에서는 세부 정보를 제공합니다.
- 2.5.1절. “사용할 인증 정보 저장소 만들기”
- 2.5.2절. “시스템 속성이 인증 정보 저장소 구성을 보유할 때 동작”
- 2.5.3절. “인증 정보 저장소 시스템 속성 및 환경 변수 설명”
-
2.5.4절. “
credentials-store:create
명령 참조” -
2.5.5절. “
credential-store:store
명령 참조” -
2.5.6절. “
credentials-store:list
명령 참조” -
2.5.7절. “
credential-store:remove
명령 참조” - 2.5.8절. “인증 정보 저장소 사용을 활성화하는 구성 관리자 속성의 예”
2.5.1. 사용할 인증 정보 저장소 만들기
Fuse를 실행 중인 Apache Karaf 컨테이너에서 사용 자격 증명 저장소를 사용하고, 인증 정보 저장소를 생성 및 구성한 다음 값을 추가합니다. Fuse는 계속 실행되며 인증 정보 저장소를 사용할 수 있습니다.
사전 요구 사항
인증 정보 저장소를 생성할 때 다음 기본값을 사용합니다.
- PKCS#12 인증 정보 저장소를 생성합니다.
-
masked-SHA1-DES-EDE
알고리즘을 적용하여 자격 증명 저장소를 암호화합니다. - 알고리즘을 200000 번 반복합니다.
-
${karaf.etc}/credential.store.p12
에서 인증 정보 저장소를 찾습니다.
-
인증 정보 저장소 구성을
${karaf.etc}/system.properties
에 저장하려고 합니다.
이러한 동작을 변경해야 하는 경우 credentials -store:create 명령 호출에
대한 정보를 참조하십시오.
프로세스
인증 정보 저장소 암호를 선택합니다.
나중에 인증 정보 저장소에 값을 추가하거나 값을 해독하려는 경우 인증 정보 저장소 명령에서는 인증 정보 저장소 암호를 사용하여 값을 암호화하고 암호 해독합니다.
credentials
-store:create
명령을 호출하여 선택한 인증 정보 저장소 암호를 입력하라는 메시지를 표시합니다.karaf@root()> credential-store:create --persist Credential store password: ***** Credential store password (repeat): ***** Credential store configuration was persisted in ${karaf.etc}/system.properties and is effective. Credential store was written to /data/servers/fuse-karaf-7.4.0.fuse-740060/etc/credential.store.p12 By default, only system properties are encrypted. Encryption of configuration admin properties can be enabled by setting felix.cm.pm=elytron in etc/config.properties.
이 명령은
etc/system.properties
에 다음과 같은 구성을 작성합니다.credential.store.location = /data/servers/fuse-karaf-7.4.0.fuse-740060/etc/credential.store.p12 credential.store.protection.algorithm = masked-SHA1-DES-EDE credential.store.protection.params = MDkEKFJId25PaXlVQldKUWw5R2tLclhZQndpTGhhVXJsWG5lNVJMbTFCZEMCAwMNQAQI0Whepb7H1BA= credential.store.protection = m+1BcfRyCnI=
다음과 같이
credential-store:store
명령을 호출하여 인증 정보 저장소에 암호화된 값을 추가합니다.credential-store:store 별칭
alias
를 고유한 키 값으로 바꿉니다. 나중에 인증 정보 저장소에 추가하는 암호화된 값을 검색하려면 툴에서 이 별칭을 사용합니다. 예를 들어 코드에서db.password
시스템 속성을 사용하고etc/system.properties
파일에db.password
속성을 데이터베이스의 실제 암호로 설정하는 항목이 있다고 가정합니다. 시스템 속성db.password
를 별칭으로 지정하는 것이 좋습니다.이 명령을 호출하면 입력하라는 메시지를 표시하고 인증 정보 저장소에 추가할 중요한 값을 확인합니다. 프롬프트에서
db.password
별칭 예제를 계속 사용하면 데이터베이스에 대한 실제 암호를 입력합니다.karaf@root()> credential-store:store db.password Secret value to store: ****** Secret value to store (repeat): ****** Value stored in the credential store. To reference it use: CS:db.password
etc/system.properties
파일에서 항목을 업데이트하거나 새 항목을 추가합니다. 업데이트하거나 추가하는 항목은 credentials-store:store
명령에 지정한 별칭을 명령이 출력하는 참조 값으로 설정합니다. 예를 들면 다음과 같습니다.db.password = CS:db.password
Fuse가 구성된 인증 정보 저장소로 실행 중이면
db.password
시스템 속성의 각 인스턴스를 인증 정보 저장소에 있는 실제 시크릿 값으로 동적으로 대체합니다.-
credential-store:store
명령에서 지정한 별칭이 이미 사용 중인 시스템 속성인 경우 다음 단계로 건너뜁니다. 코드가 시크릿에 지정한 별칭을 아직 사용하지 않는 경우 시크릿이 필요한 각 파일에서 이전 단계에서 시스템 속성으로 추가한 별칭을 지정합니다. 예를 들어 코드는db.password
를 참조합니다. - 인증 정보 저장소에 추가할 각 값에 대해 이전 세 단계를 반복합니다.
결과
인증 정보 저장소를 사용할 준비가 되었습니다. Fuse가 시작되거나 인증 정보 저장소 번들이 다시 시작되면 시스템 속성을 처리하여 해당 참조 인증 정보 저장소 항목을 찾습니다. 이러한 각 시스템 속성의 경우 Fuse는 인증 정보 저장소에서 관련 값을 가져오고 시스템 속성을 실제 시크릿 값으로 대체합니다. 그러면 해당 시스템 속성의 인스턴스가 포함된 모든 구성 요소, 번들 및 코드에서 실제 시크릿 값을 사용할 수 있습니다.
2.5.2. 시스템 속성이 인증 정보 저장소 구성을 보유할 때 동작
인증 정보 저장소가 사용 중이며 시스템 속성을 사용하여 구성 매개 변수를 보유하고 있다고 가정합니다. Fuse가 시작되면 모든 시스템 속성을 처리합니다. Fuse는 CS:
접두사가 인증 정보 저장소에 있는 연결된 값과 함께 값으로 설정된 시스템 속성을 대체합니다. Fuse는 java.lang:type=Runtime
Cryostat를 프록시하여 Cryostat getSystemProperties()
메서드를 통해 암호 해독된 값을 숨기도록 합니다.
예를 들어 하나의 항목이 있는 인증 정보 저장소를 고려해 보십시오.
karaf@root()> credential-store:list --show-secrets Alias │ Reference │ Secret value ────────────┼────────────────┼───────────── db.password │ CS:db.password │ sec4et
이 항목을 인증 정보 저장소에 추가한 후 etc/system.properties
파일을 편집하여 이 항목을 추가하십시오.
db.password = CS:db.password
Fuse가 시작되거나 org.jboss.fuse.modules.fuse-credential-store-core
번들을 다시 시작할 때 Fuse에서 db.password
시스템 속성에 대한 참조를 확인합니다. 각 참조에 대해 Fuse는 CS:db.password
별칭을 사용하여 인증 정보 저장소에서 관련 값을 가져옵니다. 다음 명령을 호출하여 확인할 수 있습니다.
karaf@root()> system:property db.password sec4et
그러나 Cryostat를 사용하여 이를 확인하는 경우 인증 정보 저장소의 값이 숨겨집니다.
2.5.3. 인증 정보 저장소 시스템 속성 및 환경 변수 설명
시스템 속성 또는 환경 변수를 사용하여 인증 정보 저장소 구성 매개변수를 저장할 수 있습니다. 인증 정보 저장소를 생성할 때 지정하는 옵션에 따라 결정됩니다.
- 속성 또는 변수를 직접 설정해야 하는지 여부입니다.
- 속성 또는 변수의 정확한 값은 속성 또는 변수여야 합니다.
속성/변수를 이해하면 인증 정보 저장소의 작동 방식을 이해하는 데 도움이 됩니다.
credential-store:create
명령을 호출하고 --persist
옵션만 지정하면 명령은 시스템 속성을 인증 정보 저장소 구성 매개변수로 설정합니다. 인증 정보 저장소 시스템 속성을 명시적으로 설정할 필요가 없습니다.
대신 인증 정보 저장소 환경 변수를 사용하거나 credential-store:create
명령의 기본 동작을 변경하려면 인증 정보 저장소를 생성할 때 지정할 수 있는 옵션에 대한 자세한 내용은 credential-store:create
명령 참조를 참조하십시오.
인증 정보 저장소를 생성하는 명령을 호출할 때 지정하는 옵션에 따라 인증 정보 저장소 속성 또는 변수의 설정이 결정됩니다. 속성 또는 변수를 직접 설정해야 하는 경우 credentials -store:create
명령의 출력에는 해당 작업에 대한 지침이 포함되어 있습니다. 즉, 인증 정보 저장소 시스템 속성 또는 환경 변수의 설정을 결정하는 것은 쉽지 않습니다. credential-store:create
명령을 실행하면 항상 설정이 결정됩니다.
다음 표에서는 인증 정보 저장소 속성 및 변수를 설명합니다. 특정 매개변수의 경우 환경 변수와 시스템 속성이 모두 설정된 경우 환경 변수 설정이 우선합니다.
이름 | 설명 |
---|---|
환경 변수:
시스템 속성: | 인증 정보 저장소 명령에서 암호화 키를 파생하는 데 사용하는 PBE(암호 기반 암호화) 알고리즘입니다. |
환경 변수:
시스템 속성: | 인증 정보 저장소의 위치입니다. |
환경 변수:
시스템 속성: | 인증 정보 저장소에서 암호화 키를 파생하는 데 사용하는 매개변수입니다. 매개 변수에는 반복 횟수, 초기 벡터 및 Salt가 포함됩니다. |
환경 변수:
시스템 속성: |
인증 정보 저장소에서 암호 또는 기타 보안 데이터를 복구하기 위해 인증 정보 저장소에서 암호를 해독해야 하는 암호입니다. |
2.5.4. credentials-store:create
명령 참조
인증 정보 저장소를 생성하고 구성하려면 다음 형식의 credentials -store:create
명령을 호출합니다.
credential-store:create [options]
옵션을 지정하지 않으면 명령에서 다음을 수행합니다.
- 선택한 인증 정보 저장소 암호를 입력하라는 메시지를 표시합니다.
- PKCS#12 인증 정보 저장소 생성
-
masked-SHA1-DES-EDE
알고리즘을 사용하여 인증 정보 저장소를 암호화 - 알고리즘 200000 번 반복합니다.
-
${karaf.etc}/credential.store.p12
에서 인증 정보 저장소를 찾습니다. - 인증 정보 저장소 구성을 저장하지 않음
다음 표에서는 기본 동작을 변경하기 위해 지정할 수 있는 옵션을 설명합니다.
옵션 | 설명 |
---|---|
| 환경 변수 또는 마스터 암호 값으로 설정된 시스템 속성을 사용하여 이 옵션을 따릅니다. 인증 정보 저장소는 알고리즘과 함께 이 값을 사용하여 암호화 또는 암호 해독 키를 파생합니다.
명령을 호출한 후
예: |
| 선택한 마스터 암호의 일반 텍스트 값을 사용하여 이 옵션을 따르십시오. 마스터 암호의 일반 텍스트 값이 기록에 표시됩니다. 인증 정보 저장소는 알고리즘과 함께 이 값을 사용하여 암호화 또는 암호 해독 키를 파생합니다.
명령을 호출한 후
예: |
| 인증 정보 저장소의 강제로 생성합니다. 인증 정보 저장소가 새 인증 정보 저장소의 의도된 위치에 있는 경우 이 옵션의 사양으로 인해 명령이 기존 인증 정보 저장소를 덮어씁니다. 기존 인증 정보 저장소의 모든 콘텐츠가 손실됩니다. 기본 동작은 의도한 위치에 이미 인증 정보 저장소가 있는 경우 명령에서 인증 정보 저장소를 생성하지 않는다는 것입니다. |
|
새 인증 정보 저장소의 위치를 지정합니다. 권장 사항은 기본 위치 |
| 사용 중인 암호화 알고리즘을 반복적으로 적용하는 횟수를 나타내는 정수를 사용하여 이 옵션을 따릅니다. 각 반복은 이전 결과를 가져와서 알고리즘을 다시 적용합니다. 결과는 최종 마스크된 암호입니다. 기본값은 200000입니다. |
|
masked 암호를 생성하는 데 사용할 credentials |
|
새 인증 정보 저장소의 구성을
이 옵션을 생략하는 이유는 인증 정보 저장소 구성 매개변수 값을 확인해야 하기 때문입니다. 또는 |
| 명령 구문 및 옵션에 대한 정보를 표시합니다. |
--persist
를 지정하지 않고 인증 정보 저장소를 생성하는 예
다음 명령은 인증 정보 저장소를 생성하지만 ${karaf.etc}/system.properties
에 인증 정보 저장소 구성을 저장하지 않습니다. 이 명령은 기본값인 masked-SHA1-DES-EDE
알고리즘을 사용합니다.
karaf@root()> credential-store:create Credential store password: ***** Credential store password (repeat): ***** Credential store was written to /data/servers/fuse-karaf-7.4.0.fuse-740060/etc/credential.store.p12 By default, only system properties are encrypted. Encryption of configuration admin properties can be enabled by setting felix.cm.pm=elytron in etc/config.properties. Credential store configuration was not persisted and is not effective. Please use one of the following configuration options and restart Fuse. Option #1: Configure these system properties (e.g., in etc/system.properties): - credential.store.protection.algorithm=masked-SHA1-DES-EDE - credential.store.protection.params=MDkEKGdOSkpRWXpndjhkVVZYbHF4elVpbUszNW0wc3NXczhNS1A5cVlhZzcCAwMNQAQIDPzQ+BDGwX4= - credential.store.protection=0qudlx1XZFM= - credential.store.location=/data/servers/fuse-karaf-7.4.0.fuse-740060/etc/credential.store.p12 Option #2: Configure these environmental variables (e.g., in bin/setenv): - CREDENTIAL_STORE_PROTECTION_ALGORITHM=masked-SHA1-DES-EDE - CREDENTIAL_STORE_PROTECTION_PARAMS=MDkEKGdOSkpRWXpndjhkVVZYbHF4elVpbUszNW0wc3NXczhNS1A5cVlhZzcCAwMNQAQIDPzQ+BDGwX4= - CREDENTIAL_STORE_PROTECTION=0qudlx1XZFM= - CREDENTIAL_STORE_LOCATION=/data/servers/fuse-karaf-7.4.0.fuse-740060/etc/credential.store.p12
2.5.5. credential-store:store
명령 참조
암호화된 값을 인증 정보 저장소에 추가하려면 다음 형식의 credentials -store:store
명령을 호출합니다.
credential-store:store 별칭 [secret]
alias
를 고유한 키 값으로 바꿉니다. 인증 정보 저장소에 추가하는 암호화된 값을 검색하려면 툴에서 이 별칭을 사용합니다.
선택적으로 시크릿을
암호화하고 인증 정보 저장소에 추가할 값으로 교체합니다. 일반적으로 암호이지만 암호화하려는 모든 값이 될 수 있습니다.
명령줄에서 secret
을 지정하면 일반 텍스트 값이 기록에 표시됩니다. 명령줄에서 secret
을 지정하지 않으면 명령에서 입력 프롬프트를 표시하고 값은 기록에 표시되지 않습니다.
명령에 대한 정보를 보려면 다음을 입력합니다.
credentials-store:store --help
.
다음 명령줄은 인증 정보 저장소에 항목을 추가하는 예입니다.
karaf@root()> credential-store:store db.password sec4et Value stored in the credential store. To reference it use: CS:db.password
이제 인증 정보 저장소에 CS:db.password
를 지정하여 참조할 수 있는 항목이 있습니다.
2.5.6. credentials-store:list
명령 참조
인증 정보 저장소의 항목 별칭을 가져오려면 인증 정보 저장소에 모든 항목 목록을 표시하는 credentials-store:
list 명령을 호출합니다. 예를 들면 다음과 같습니다.
karaf@root()> credential-store:list Alias │ Reference ─────────────┼─────────────── db.password │ CS:db.password db2.password | CS:db2.password
인증 정보 저장소에서 암호화된 보안 값의 암호 해독도 나열하려면 다음과 같이 명령을 호출합니다.
karaf@root()> credential-store:list --show-secrets Alias │ Reference │ Secret value ─────────────┼─────────────────┼───────────── db.password │ CS:db.password │ sec4et db2.password | CS:db2.password | t0pSec4et
명령에 대한 정보를 보려면 다음을 수행합니다.
karaf@root()> credential-store:list --help
2.5.7. credential-store:remove
명령 참조
인증 정보 저장소에서 항목을 제거하려면 다음 형식의 credentials -store:remove
명령을 호출합니다.
credential-store:remove 별칭
별칭
을 인증 정보 저장소에 항목을 추가할 때 alias
인수에 대해 지정한 고유 키 값으로 바꿉니다. CS:
접두사를 지정하지 마십시오. credentials -store:list
명령을 호출하여 별칭을 가져올 수 있습니다.
credentials -store:remove
명령은 사용자가 지정한 별칭이 있는 항목의 인증 정보 저장소를 확인하고 해당 저장소를 제거합니다. 예를 들면 다음과 같습니다.
karaf@root()> credential-store:remove db.password Alias │ Reference │ Secret value ─────────────┼─────────────────┼───────────── db2.password | CS:db2.password | t0pSec4et
명령에 대한 정보를 보려면 다음을 수행합니다.
karaf@root()> credential-store:remove --help
2.5.8. 인증 정보 저장소 사용을 활성화하는 구성 관리자 속성의 예
개발 환경에서는 구성 관리자 서비스 속성을 사용하여 인증 정보 저장소를 사용할 수 있습니다. 구성 관리자 속성은 etc/*.cfg
파일에 정의됩니다.
인증 정보 저장소를 사용할 수 있도록 구성 관리자 속성을 사용하는 것은 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다. Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 https://access.redhat.com/support/offerings/techpreview/를 참조하십시오.
준비
-
credential-store:create
명령을 호출하여 인증 정보 저장소를 생성합니다.credential-store:create 명령 참조를
참조하십시오. -
etc/config.properties
파일을 편집하여 구성 관리자 속성 사용을 활성화하여fe#159.cm.pm = elytron : 행의 주석을 제거합니다.
# When uncommented, configuration properties handled by Configuration Admin service will be encrypted when storing # in etc/ and in bundle data. Values of the properties will actually be aliases to credential store entries. # Please consult the documentation for more details. felix.cm.pm = elytron
Fuse가 시작되면 어떻게 됩니까
fe#159.configadmin
번들:-
fe#159.cm.pm
속성이 설정되어 있으므로ConfigurationAdmin
서비스 등록 지연. -
name=cm
OSGi 서비스 등록 속성을 사용하여org.apache.fe Cryostat.cm.PersistenceManagerOSGi
서비스의 가용성을 기다립니다.
-
Fuse 인증 정보 저장소 번들:
-
credentials.store에 설정된 값을 사용하여
인증 정보 저장소를 로드합니다.
* 시스템 속성 또는 credentials_STORE_
* 환경 변수를 사용합니다. -
org.apache.fe Cryostat.cm.PersistenceManagerOSGi
서비스를 구현하는 OSGi 서비스를 등록합니다.
문제가 발생하면 인증 정보 저장소 번들에서
지속성Manager
서비스를 등록합니다. 이 서비스는 특별한 작업을 수행하지 않습니다. 문제가 발생하거나 인증 정보 저장소를 사용할 수 없는 경우 Fuse는 암호화되지 않은 구성 값을 읽을 수 있어야 합니다.CS:
접두사로 지정된 암호화된 값은 원래 값을 기억하거나 인증 정보 저장소와 해당 구성을 복구하지 않는 한 손실됩니다.-
credentials.store에 설정된 값을 사용하여
-
con
hi 192.0.2..configadmin
프로세스는 새 지속성 관리자 서비스를 사용하여 인증 정보 저장소 구성을 로드하고 저장합니다.
예
인증 정보 저장소에 두 개의 항목이 있다고 가정합니다.
karaf@root()> credential-store:list --show-secrets Alias │ Reference │ Secret value ────────────┼────────────────┼───────────── db.password │ CS:db.password │ sec4et http.port │ CS:http.port │ 8182
구성 관리 서비스 구성에서 실제 값 대신 중요한 값에 대한 별칭을 사용하도록 선택합니다. 예를 들어 다음과 같이 웹 구성 속성을 변경합니다.
karaf@root()> config:property-list --pid org.ops4j.pax.web javax.servlet.context.tempdir = /data/servers/fuse-karaf-7.4.0.fuse-740060/data/pax-web-jsp org.ops4j.pax.web.config.file = /data/servers/fuse-karaf-7.4.0.fuse-740060/etc/undertow.xml org.ops4j.pax.web.session.cookie.httpOnly = true org.osgi.service.http.port = 8181 karaf@root()> config:property-set --pid org.ops4j.pax.web org.osgi.service.http.port CS:http.port karaf@root()> config:property-list --pid org.ops4j.pax.web javax.servlet.context.tempdir = /data/servers/fuse-karaf-7.4.0.fuse-740060/data/pax-web-jsp org.ops4j.pax.web.config.file = /data/servers/fuse-karaf-7.4.0.fuse-740060/etc/undertow.xml org.ops4j.pax.web.session.cookie.httpOnly = true org.osgi.service.http.port = CS:http.port
로그에서 다음 줄의 끝에 볼 수 있듯이 실제 값인 8182
가 표시될 수 있습니다. 로그에서 실제 텍스트 값을 표시하는지 여부는 암호화된 값을 사용하는 구성 요소에 따라 결정됩니다.
2019-03-12 15:36:25,648 INFO {paxweb-config-2-thread-1} (ServerControllerImpl.java:458) : Starting undertow http listener on 0.0.0.0:8182
이전 명령에서 두 번째 config:property-list --pid org.ops4j.pax.web
명령은 8182
대신 CS:http.port
를 표시합니다. pax-web-undertow
프로세스는 이 포트에서 시작됩니다. 이는 OSGi 후크가 config:property-list --pid org
프로세스를 방지하기 때문입니다. 또한 .ops4j.pax.web
명령의 출력을 보여주는 fe#159.fileinstalletc/org.ops4j.pax.web.cfg
파일이 해독된 값을 저장하지 않고 대신 다음과 같이 저장합니다.
org.osgi.service.http.port = CS:http.port org.ops4j.pax.web.config.file = ${karaf.etc}/undertow.xml org.ops4j.pax.web.session.cookie.httpOnly = true javax.servlet.context.tempdir = ${karaf.data}/pax-web-jsp