slide-image

user authenticaion에서 시스템은 인증된 신원 정보를 토대로 접근 제어를 처리한다.

NISP SP 800-63-3의 사용자 인증 모델에서 RA는 registration authority이고, CSP는 credential service provide이다. 사용자는 RA에게 요청해서 CSP의 가입자가 되는 것인데, RA는 신원 정보를 검증하고 CSP에게 확인을 해준다. CSP는 전자 신용 증명서(credential)를 가입자에게 발급하고, credential은 identity와 attributes를 token에 연결시킨다. 

이렇게 등록된 token과 credential을 이용해서 claimnat와 verifier사이에 인증이 이루어진다. 프로토콜을 통해 인증이 되면, 검증된 기타 속성 정보와 신원정보를 RP(relaying party)에게 넘긴다. RP는 이를 바탕으로 접근제어나 허가에 대한 결정을 내린다. 

 

인증의 수단으로는 stm individual knows, possesses, is, does로 나눌 수 있다.

각가의 방식마다 문제점이 있을 수 있으므로 multifactor authentication(두 가지 이상의 수단)을 이용하는 것이 좋다.

 

패스워드 기반 인증은 ID와 패스워드를 요구하는데, ID는 사용자가 시스템에 접근 가능한지 여부를 결정학, 사용자의 권한을 결정하며, Discretionary access control에도 사용이 가능하다. 

하지만 패스워드는 offline dictionary attack(파일을 이용한 오프라인 공격)이 가능하고, specific account attack과 popular password attack, guessing against single user, workstatin hijacking, exploiting user mistakes, expliting multiple password use, electronic monitoring 공격이 가능하다.

그렇지만, 패스워드는 하드웨어 스캐너 등 별도 장비가 불필요하고 물리 토큰에 비해 저렴하고 간편하며, Single sign-on to multiple services한다면 sinle point of security risk취약점이 될 수 있다. 또한 패스워드 매니저는 다양한 환경 동기화가 안된다는데 이건 최근을 반영하지 못한거라고 하셨었다.

 

아 졸려

기왕이면 바나나로~!

 

패스워드 파일은 (id, salt, h)형태로 저장한다. h=H(salt||password)임.

해쉬함수는 임의 길이의 문자열을 특정 고정 길이 문자열로 보내는 deterministic한 함수이다. 특징으로는 onewayness, preimage resistance, collision resistant(computationally 1to1)이다. 리눅스 명령어로는 echo -n "문자열" | openssl sha1이런식으로 하면 된다. 이렇게 패스워드를 저장하지 않고, 그 해쉬값을 저장하며, 매우 느린 해쉬함수가 필요하다.

salt는 하나의 타켓 패스워드 공격하는 것은 별로 효과가 없지만, 여러 패스워드를 동시에 공격하는 것을 어렵게 만든다. 또한 동일 패스워드에 대한 해쉬값이 다르게 되도록 만들고, 여러 시스템에 같은 패스워드를 사용하는지도 숨길 수 있고 오프라인 dictionary attack의 복잡도를 늘린다. precomputation에 의한 공격 역시 복잡도가 올라간다. 

 

UNIX 패스워드는 최대 8글자로 하위 7비트만 모아서 56비트 DES 키를 만든다. [a-zA-Z0-9./]에서 2글자를 골라 salt 12비트를 정하고, salt에 의해 변형된 DES알고리즘을 이용해 모든 비트가 0인 블록을 25번 암호화한다. 그래서 Salt+결과 값 64비트 출력을 13글자로 바꾼다. 

DES 25회는 충분히 느리지 않고, 8글자 역시 충분하지 않다. 그래서 현대 Unix-like시스템들은 보다 나은 해쉬함수나 길이 제약을 제거하고, 더 많은 반복을 사용한다. 

 

etc/passwd파일은 root : x :0 : 1...식으로 되어있는데, x는 옛날에 패스워드가 있었고 지금은 /etc/shadow에 저장이 된다.

 

패스워드 공격은 크게 나누어서 온라인 공격과 오프라인 공격으로 나눌 수 있다. 온라인 공격은 다양한 패스워드를 가지고 로그인을 시도하여 여러 번 틀리면 막을 수 있으며, 오프라인 공격은 패스워드 파일이 불필요하며 공격자가 개인 컴퓨터 상에서 공격 알고리즘을 수행한다. 

 

password guessing 패스워드 추측방법은, 알려진 단어들이나 그 단어의 변형들, 가능한 모든 패스워드(특정 길이까지)를 선택해 각각의 것들을 h(salt||패스워드)형태로 맞추어서 시도하는 것이다.

 

precomputation 사전 계산은, 특정 길이까지 가능한 모든 패스워드 해쉬값을 계산해서 거대한 테이블로 만든 것이다. salt가 없다면 표를 찾아보면 패스워드 복구가 가능하지만, salt가 있다면 거의 불가능. 장점은 매우 빠르지만, 단점은 표가 너무 크다. 

 

time-memory tradeoff 은 사전계산으로부터 나오는 표의 크기를 줄이는 방법으로,  대표적으로 raibow table같은 기법이 있다. 사전 계산의 결과값은 적당히 크므로, 개별 해쉬에 대한 패스워드 복구는 단순 lookup보다는 오래 걸리지만, 사전 계산이 없는 것보다는 빠르다. 

 

약한 패스워드는 짧고, 예측 가능한 개인정보로 만들어지고, 단순 변형이 된 패스워드이다. 크래커는 이런 특성을 공격에 반영한다.

 

위의 password guessing, precomputation, time-memory tradeoff는 전통적인 접근법이었다면, 현대적 접근법은 병렬 계산이나 보다 나은 패스워드를 선택하는 방법이다. 병렬 계산은 GPU를 사용해 병렬 계산을 통해 속도를 향상시키는 것이다. 8.2*10^9개의 패스워드를 초당 시험할 수 있다고 한다. 

 

보다 나은 패스워드를 선택하려면 Markov 모델(어떤 종류의 패스워드는 잘 선택되지 않는다)을 이용한다. 

(기계학습에 나오는 그거 아닌가? 책보고 다시 추가하겠음)

 

패스워드 파일 접근제어에 관해서는 UNIX 초창기에는 /etc/passwd에 저장되었다가, 모든 사용자가 접근 가능하지 않도록 superuser만 접근 가능한 /etc/shadow로 이동하였다.(내부자, 오프라인 어택 막기 위해) 그래도 패스워드 파일 노출이 가능하므로 더 강한 패스워드 사용이 필요하다.

 

패스워드 정책으로는 기억이 가능하고, 추측이 어려워야 하는데, user education, computer-generated passwords, reactive password checking, complex password policy의 방법들이 있다.

 

사용자 교육은 어렵고 기억하기 쉬운 패스워드를 만드는 기법에 대한 교육이다. 예를 들어 문자에 기반한 패스워드를 만드는 방법이 있는데, my dog is cute, his name is tonkey라면, mdichnit로 하는 것임. 또한 4개의 단어를 기억하는 것인데, 그 단어를 조합해서 하나의 이미지를 만들어서 기억하는 것이다. 하지만 현대 패스워드 크래커들은 다른 단어들도 조합한다....

 

컴퓨터가 생성한 패스워드는 추측이 어려운 강한 패스워드이고, 패스워드 정책을 따르기 쉽고, 중복 사용을 자동으로 피한다. 하지만 암기가 어려우므로 패스워드 매니터 프로그램이 필요하다.

 

패스워드 관리 프로그램은 게정 별로 패스워드들을 생성, 저장, 백업, 동기화 등을 관리하며, 입력을 자동화 한다. 사용자는 마스터 패스워드만 기억하면 되는데, 최근에는 OS자체가 이런 기능을 제공하는 경우도 있다.

 

password checking은 reactive와 proactive가 있는데, reactive password checking은 시스템이 정기적으로 패스워드 파일에 대한 자동화된 해킹을 시도하는 것임. Proactive password checking은 더 복잡한 패스워드 정책으로 길이는 16자 이상이라던가 뭐 숫자나 대문자 특수문자등을 포함해야한다는 정책같은 것을 말한다. 또한 나쁜 패스워드의 사전을 만들어 사전에 수록된 패스워드를 거부하는 것도 포함한다.

 

정보이론 엔트로피는 수식이 너무 많아서 생략함 ^^

 

어쨋든 결론은 기본적으로 암기할 수 있는 패스워드는 높은 엔트롶를 갖기 어렵다는 것이다. 길이가 길어도 암기하기 쉬운 패스워드는 균일 분포하지 않으므로, 높은 확률로 쉬운 패스워드가 선택된다. 이들은 낮은 min-entropy를 가지므로 기억술을 이용해 보다 복잡한 패스워드를 암기하는 것이 좋다.(아까 말한 심상술이라던가, 단어 첫글자 따기)

 

나쁜 패스워드의 사전 문제는 나쁜 패스워드가 많으면 저장공간을 많이 차지할 뿐만 아니라, 큰 사전을 검색할 시에 드는 시간 또한 길어진다는 것이 단점이다. 이를 해결하지 위해서 블룸 필터를 사용할 수 있다.

 

블룸필터는 꼭 이 용도로만 사용되지는 않는다. 필자는 데이터베이스 암호화 검색에서 썼었음. 여튼 D가 패스워드 사전이라면, d는 D의 크기이고, H1, H2,.... Hk는 서로 독립적인 해쉬함수이다. Hi:{0,1}*->{0,1,,,,,N-1}

패스워드 사전을 그냥 저장하지 않고, 대신 N비트로 압축해서 저장하는 것인데, Hi(Xj)=y이면, N비트 중 y번째 비트를 1로 만든다. 그래서 최대 kd개의 1이 찍힌다. (해쉬함수가 k개임)

 

D를 위한 저장공간은 최소 d이고, 블룸필터를 위한 저장공간은 N이다. 어떤 패스워드 X가 시도되면, Hi(X)들을 모두 계산해서 모든 위치가 1로 되어 있으면 X를 거부하는 것이다. 모든 위치가 1이라는 것은 X가 D에 이미 포함이 되어있을 때 이다. 하지만 운이 정말 안좋으면 D가 포함이 안 되어도 거부될 수 있다.(압축한 거니까) k, d, N을 적절하게 잡으면 오류 확률을 충분히 줄일 수 있다.

 

이 운이 안 좋을 확률은 (1-e(-kD/N)^)^k이다. 수식 증명은 알아서..

 

뭐 만약에 백만 단어로 이루어진 사전이면 8글자 일 때, p=0.01을 목표로 한다면 k=6일 때, N/D=9.6이므로, 9.6*10^6bits=1.2MB이다. 따라서 D 저장에는 최소 8MB가 필요하다(8글자라고 가정)

 

패스워드의 갱신은 장점이 별로 없다.. 단점만 많은데 기억에 부담을 주고, 단순 변형을 오히려 권장한다.

 

NIST의 패스워드 가이드라인 (SP 800-63B)은 길이만 길게하는 복잡한 패스워드 정책을 쓰지 말아야 하고, 잦은 패스워드 변경을 강요하지 말아야 한다. 또한 침해의 증거가 있다면 변경을 가제해야 하고, password Manager을 위해 패스워드 입력시 붙이기 기능을 지원해야 한다. 

 

와 언제 다하지