HSM 교육 후기
9시반까지 오라고 해서 새벽부터 일어나서 왔는데 10시부터 시작했습니다 ㅠ
혼자 온 사람은 나밖에 없었고.. 다들 최소 2명이상 이었습니다.
자꾸 서두에 알고계시는 분들 많을거라고 깔고가서 질문하기가 미안했지만..
철판 깔고 계속 물어보았답니다!
그나저나 시설이 정말 최고였습니다. 세미나 + 교육 역사상 가장 좋았던
파크 하얏트 서울 !
시설 뿐만 아니라 점심으로는 코스요리가 나왔습니다.
안창살 미디움 레어 오져따리 오져따
아래는 교육 들으면서 적은거라 존칭은 생략하겠습니다.
-------------------------------------------------------------------------------------
사실 HSM에는 일반적으로 아는 것보다 더 많은 기능들이 있다.
그래서 오전에는 새로나온 기능 위주로 설명할 것이다.
12.50 릴리즈가 예정 되어 있다. 오늘은 12.40 을 기준으로 한다.
-새로운 기능 (ver 12.40)
기존에는 표준 API 개발을 했어야 했다.
OS 가 지원이 안된다던가. 클라우드에 HSM 관련 바이너리를 설치를 할 수 없다던가.
이제 !!!! RestAPI 로 HSM 과 통신 가능하다
Mutual SSL 로 상호인증 Server → nSheild Client Server (Hard-Server) → HSM
다만 제약 사항들이 아직 꽤 있다. :
Linux only, module protected key only
cipher only :
AES256CBC PKCS#5 ( 256 )
RSA ( 2048 )
ES512 ( P512 )
HMAC sha-256 ( 256 )
RSA SHA256 ( 2048 )
encrypt, decrypt, sign, verify only ; not generate key
POST /crypto/v1/encrypt
POST /crypto/v1/decrypt
POST /crypto/v1/sign
POST /crypto/v1/verify
GET /km/v1/keys
국내에는 아직 레퍼런스가 없다.
개발용으로 인증 안해도 API 호출 할 수 있게 가능하다.
simple 타입의 어플리케이션만 가능하다. 키 만들때 simple 타입으로 만든다.
Q. Hard-Server 에서 Mutual SSL 할 때 Private key,
클라이언트 인증서 CA가 HSM 으로 보호되나요?
A. 넵, 인증서 CA는 HSM 으로 보호(keystore - keytool 사용) 됩니다.
다만 클라이언트 인증서는 클라이언트 각자가 보호 해야 합니다.
Q. module protected key only 라는게 어떤건지?
A. 키를 사용하려면 HSM 에 스마트카드를 이용해서
한번 더 인증을 받게 하는 것(Softcard protected 등)들이 있는데 이런 키들은 제외한다는 의미.
Q. 체인을 여러개 만들어서 클라이언트별로 기능/사용가능 키 등의 권한 분리가 되는지 ?
기능이라면 어떤 애는 verify 만 되게 한다던지
클라이언트가 encrypt 시 어떤 키를 사용하는지 어떻게 알 수 있는가?
A. 권한 분류는 안된다. 그냥 클라이언트는 다 클라이언트
Q. Hard-Server 에 설치되는 API 제공 서버는 뭘로 돌아가는건지?
보안 설정은 기본적으로 어느 정도 되어 있는지?
디렉토리 리스팅 부터 시작해서 웹방화벽이라던지... CVE 패치 등등
A. 보안 설정은 해서 줄거고 CVE 패치는 필요하면 업데이트 해준다.
----------------
2차시 - 실습
키 생성 ( 로컬 )
$ generatekey simple
RSA
2048
10001
teskorea
teskoreakey
opt/nfast/kmdata/local/key_simple_teskorea
사인 요청 ( 원격 )
curl --cacert testestca.crt --cert test.crt --key test_client_key.pem --header 'Content-Type: application/json' --header 'Accept: application/json' --request POST \
-d '{"kid":"urn:uuid:어쩌고저쩌고", "alg":"RS256", "payload":"base64url 인코딩한 값", }'
'https://wsop.server:18001/crypto/v1/sign'
결과는 base64url 디코딩한 값을 사이닝한 값이다.
------------------
3차시
P11, JCE 를 표준 API 로 제공한다.
- key blob 이란 ?
key - ACL (Access Control List ) 가 같이 하나의 Blob 으로 되어 있다.
◈ 사용자 디렉토리에 저장된다.
ACL - 키 용도 ( 사인 / 암호화 등등 ), 사용 횟수 (횟수 이후 HSM 메모리에서 소거되고 다시 로드 필요), ACL 변경가능한지, ACL 볼 수 있는지, 보호 기법 ( 모듈 / 소프트카드 등)
-Cryptoki 모델 - 모든 보안 토큰(USB 형태 포함)에서 사용되는 표준임.
각 슬롯 핸들러를 통해 토큰에 접근
어플리케이션 하나가 여러개의 토큰에 접근 가능하다.
Engine ( + Random Number Generator (with seed)) - seed 는 유저로 접근 불가.
Object - 객체 클래스. 가장 큰 단위
- Data : 어플리케이션이 정의한 정보를 지닌 객체
- HW_Feature -HSM 에는 사실상 해당 사항 없음
- Storage
- Certificate
- Key
- Pub key
- Priv Key
- Sec key
P11 동작 흐름도 (24P)
Cryptoki application → 라이브러리, 토큰 디바이스 드라이버 로드
→ Token 이란 HSM 의 각 슬롯
→ 세션 핸들값을 받아옴
→ 세션에 로그인, 키를 생성하거나 파기, 암복호화, 서명
→ 세션 하나에는 하나의 일만 배정 가능하므로 보통 쓰레드를 20개 까지 사용한다.
SO: Security Officer
lifetime 에 따라서
Token Object 는 세션 종료 이후에도 남아있음. (인증서 발급 등)
Session Obejct 는 세션 때만 살아있음. (한번 쓰이고 버려지는 유도키 등)
접근 권한에 따라서
Public object :Token 에 대한 로그인 필요 없음
Private Object : 로그인, Pin 등 필요
RO / RW 가능.
세션 핸들 값은 새롭게 얻어와야 한다. ( 만료되며, 업데이트가 된다 )
-Cryptoki 개념
슬롯 관리 (로그인 등 )
객체 관리
암호화 연산
세션은 동시에 한가지 커맨드만 수행 가능하다.
카드 k of N - 5장 중에 3장이 있는 등 몇 장 이상 있어야 사용 가능한 개념.
확장 함수 : C_LoginBegin - C_LoginNext (다음 패스워드 입력) - C_LoginEnd
p11 사전 디파인된 값, 꼭 이 prefix 를 안붙여도 되지만 가독성 때문에 쓴다.
C_ 함수 (C_Initialize, C_GetSlotList, C_Tokeninfo, C_OpenSession, C_Login 등)
CK_ 데이터
CKA_ 어트리뷰트 타입
CKC_ 인증서 타입
CKF_ 플래그 ( multithread 등 )
CKK_ 키타입
CKM_ 매커니즘
CKO_ 객체 클래스 ( 큰 단위 )
CKR_ 리턴값 - 디버그 환경변수를 enable 해주면 더 자세한 정보 획득 가능. (HSM기능)
CKU_ 사용자 분류
객체의 타입 (CK_ ) ----
데이터 타입
CK_TOKEN_INFO : 토큰에 대한 정보 구조체
- label : 어플리케이션 정의 라벨 (이름).
- ...
세션 타입
CK_SESSION_HANDLE : Cryptoki 에서 할당한 세션 ID 타입
CK_USER_TYPE : Cryptoki 사용자 분류 타입 (CKU_SO, CKU_USER, ... )
Attribute 타입
CK_ATTRIBUTE {
CK_ATTRIVUTE_TYPE type;
CK_VOID_PTR pValue;
CK_ULONG ulValueLen;
}
Ex ) RSA 키를 만들기 위한 Attribute 만들기 .
각 Attribute 를 설정 해야만 제대로 키가 만들어 진다.
static CK_ATTRIBUTE rsaPublicKeyTemplate[] = {
{CKA_CLASS, &class_public, sizeof(class_public)},
{CKA_PRIVATE ...}
{CKA_MODIFIABLE, ...}
{CKA_TOKEN, ...}
{CKA_LABEL, ...}
{CKA_KEY_TYPE, ...}
...
}
나중에 코딩 할 때 만약 빠트려서 뭐가 없으면 빌드시 없다고 에러 뜨니까 걱정 노우노우
CKA_SENSITIVE : 주의. 설정이 false이면 Warning. HSM에 저장된 raw 키를 빼내 올 수 있다.
CKA_EXTRACTABLE : 다른 키로 한번 암호화 해서 wrapping 해서 빼올 수 있다.
키객체 - 인증서 각 속성들을 저장할 수 있다. 그냥 OpenSSL 연동을 다 해놔서 써도 됨.
Q. 다른 사업부로 키를 이관하는 것이 가능한가?
A. 여러가지 방법이 있고 소프트 카드를 이용해서 다른 (그러나 동일한 모델의) HSM 장비로
마이그레이션 작업을 하면 키 사용이 가능하다.
참고 :
- Optional 한 Subject 는 굳이 지정해서 null 할 필요 없이 그냥 안 넣어주면 된다.
- 키를 동일한 레이블(이름)로 생성하면 그냥 중복 생성된다.
찾기 어려우니까 중복되지 않도록 할것.
- dynamic load 를 이용하면 동적으로 각 OS Dependency 하게 라이브러리 로딩함
- 보통 P11 에서는 goto err 등 goto 문을 많이 사용한다. 이러면 메모리가 절약 됨.
무조건 안쓰는것도 방법이 아니다. goto 로 가서 할당했던 메모리 들을 해제.
버퍼 할당 방법
사전에 정적 배열로 할당
1. 버퍼가 얼마나 될건지 계산해서 그 이상을 할당해야 한다.
2. 먼저 작게 할당 한후 버퍼가 너무 작았으면 realloc 을 해준다.
쿼리 and 할당
1. 사인/인크립트/디크립트 을 할 때 output 을 null 로 주면된다.
이러면 HSM 이 output 을 준다. 간단하지만 정적 할당보다 많은 메모리가 사용 됨.
strict_fips → 정책적으로 반드시 private 은 1로 설정 extractable 은 0으로 설정해야
키 생성시 에러가 안난다.
------------------------
4차시. 소스코드 보면서 알려주기
PKCS#11 - ckutil.c 참조
find_key_ex (ckutil.c)
-label 이나 id 기준으로 찾는다.
JCE - Java Cryptographic Extension - JCEPerfcheck.java 참조
제공 라이브러리를 사용하면 자동으로 HSM 과 연동된다.
P11 보다 간결하지만, 좀 더 명확하고 디테일한 옵션을 주기는 어렵다.
일단 시스템 프로퍼티만 연동되도록 하면 된다.
먼저 KeyPairGenerator 인스턴스 등을 생성
에러가 나면 errExit 로 종료하거나 errStop 로 Thread 를 멈출 것이냐로 적절히 처리한다.
키를 저장해 두고 쓰려면 keystore 를 사용해야 한다.
→ 우리가 생각하는 그 keystore 쓰듯이 쓰면 되는데 내부적으로는 HSM 연동된다.
즉, HSM 에서 사용가능한 keyblob 이 만들어지고 keystore 에 저장된다.
Q. ncorekey 랑 jcekey랑 어떤 차이인지?
A. jce 는 자바 표준이고, 특정 매커니즘들은 지원하지 않는다. 예를들면
jce 는 sign 과 hash 가 분리되지 않아서
hash 만 보내서 HSM 에서 서명하도록 할 수가 없다.
그렇다고 바이너리 전체를 HSM에 보내는것은 무리데스
그래서 우리가 만든 ncore 로 하면 hash 를 하지 않고 서명만 하는게 가능하다.
Q. 소스코드가 없는 경우.. 바이너리를 HSM에 넣을 수 있나?
A. 불가능하다.
Q. 특정 사업부에서 다른 사업부로 키를 마이그레이션 하려고 한다.
뭔가 키에다가 설정해야 될 게 있을까?
A.디폴트 설정으로 생성하면 마이그레이션 가능이다.
0 개의 댓글:
댓글 쓰기