2022. 6. 2. 21:04ㆍMajor`/정보보호개론
접근제어란, 시스템 자원에 대한 접근과 관련된 주제를 지칭한다
이 접근 제어는 {인증 & 인가}로 나눌 수 있다
인증이란 "신원을 모르는 user"에 대해서 시스템에 접근을 허용할지 여부를 결정하는 것이다
인가란 "인증된 user"에 대해서 시스템 자원의 어디까지 허용할지 여부를 결정하는 것이다
- 인증된 user라고 해도 시스템상의 모든 자원에 접근하게 내버려두는 것은 안된다
인증 (Authentication)
기본적으로 인증에는 3가지 방법이 존재한다
1. 알고 있는 것 (지식)
2. 가지고 있는 것 (보유)
3. 본인 자체의 것 (생체)
1. 알고 있는 것 (지식)
가장 대표적으로 user가 알고 있는 것은 "user의 Password"이다
Password는 가장 대중적인 "인증 방식"이고 가장 편리하고 가장 쉬운 방법이기도 하다
이상적인 Password란 "user가 당연히 알고 있고" & "시스템은 검증할 수 있고" & "공격자는 절대 알 수 없는 것"이다
하지만 현실적으로 이러한 조건들을 만족시키기는 힘들다
일반적인 사람들은 비밀번호를 설정할 때 "기억하기 쉽고 자신을 특정할 수 있는" 비밀번호로 설정하는 경향이 있다
- q1w2e3r4 (군대..)
- pikachu
- 1234
- 0011223344
- ....
이러한 비밀번호는 공격자들에 의해서 해킹당하기 굉장히 쉬운 비밀번호들이다
"256글자를 사용해서 8글자의 비밀번호"를 만든다고 하자
총 경우의 수는 256^(8) = 2^(64)이다
하지만 사람들의 성향에 따라서 "공격자가 공격할 경우의 수"는 2^(64)보다 현저히 작을 것이다
따라서 요즘 Computing Power로는 해킹을 당할 위험이 존재한다
현실적으로 이러한 문제에 대한 해결책은 "비밀번호를 Random하게 만들어버리기"이다
근데 비밀번호를 random하게 만들어버리면 그 비밀번호를 실제로 사용하는 user의 입장에서 외우기가 굉장히 힘들 것이다
Password를 통한 System Attack
일반적으로 Trudy(공격자)가 특정 시스템에 대한 공격을 Password를 활용해서 시도하려면 다음 과정을 거칠 것이다
1. 시스템에 대한 user의 계정에 접근 (비밀번호 해킹)
2. 시스템에 user인것처럼 접근해서 "권한 수준" 올리기
이러한 공격은 공격자 입장에서 굉장히 쉬울 것이다
그러면 이러한 공격은 어떻게 대응할까??
요즘 핸드폰에서 사용되는 "x회 이상 틀리면 시스템 잠금" 방법이 있을 것이다
하지만 여기서 고려해야 할 점은 "x"를 정해야 하고, "x'를 정하면 잠금 유지기간은 어느정도로 설정하느냐 이다
>> 따라서 Password 공격에 대한 마땅한 해결책은 없다고 할 수 있다. 그냥 사용하는 user가 잘 설정해야 한다
Password 검증
컴퓨터는 user의 password가 input으로 들어오면 "검증"을 통해서 올바르게 인증을 수행하고 있나 확인을 반드시 해야 한다
그런데 "검증"에 필요한 "검증용 비밀번호"는 어떻게 관리할까??
가장 쉽게 떠올릴 수 있는 것은 "파일에 그대로 보관하기"이다
하지만 파일에 보관하게 된다면 Attacker의 최우선 타겟은 "해당 파일"이 될 것이고, 그 비밀번호 하나뿐만 아니라 전체 시스템상의 비밀번호가 노출될 위험이 존재한다
>> 따라서 해시함수를 통해서 비밀번호를 Hashing하자
해시함수 방식은 "파일에 비밀번호 저장"은 동일하지만 저장할 때 "Hash 처리된 비밀번호"를 파일에 저장하는 것이다
- {id : Hash(Password)}
그런데 Attacker가 임의의 password 모음집을 가지고 있다고 하자
그리고 해당 모음집 전체를 각각 Hash Function에 넣은 결과인 "Hashed Dictionary"를 보유한다고 하자
그러면 Attacker는 "파일 내부의 직접적인 password"는 모르지만 "파일 내부의 Hash처리된 password"를 몰래 가져올 수 있다
그리고 본인이 보유한 Hashed Dictionary와 대조해서 진짜 비밀번호를 찾을 수 있다
>> 이러한 문제를 해결하기 위해서 "Salt"를 활용하자
이전까지는 그냥 Hash(Password)를 사용했지만 이제는 각 Password별로 "임의의 salt"값을 사용해서 Hash(Password, Salt)처리된 것을 파일에 저장하자
물론 Salt가 private value는 아니지만 Attacker는 각각의 password를 알아내려고 할 때마다 임의의 Salt 값을 통해서 매번 새로 계산해야 하기 때문에 굉장히 작업량이 늘어나게 될 것이다
2. 가지고 있는 것 (보유)
일반적으로 사람들이 가지고 있는 "인증 요소"들은 {카드, 신분증, ....}이 있을 것이다
여기서 알아볼 "가지고 있는 것 : 인증 요소"는 "패스워드 생성기"이다
패스워드 생성기란 어떤 시스템에 로그인하기 위해서 반드시 user가 가지고 있어야 하는 도구이다
※ Example)
Alice : 저 인증좀
Bob : "R"값 줄테니까 패스워드 생성기 돌려서 값 가져오세요
>> Alice는 "받은 R값" & "자신이 보유한 PIN 값"을 패스워드 생성기에 넣기
- Password_Generator(PIN, R) = K
Alice : 여기 K 구해왔어요
Bob : 인증 OK
예제에서는 총 2가지의 인증 방식을 혼합해서 사용하였다
- 가지고 있는 것 : 패스워드 생성기
- 알고 있는 것 : PIN
{지식 & 보유}라는 2가지 요소를 통해서 인증하였다
이렇게 인증을 위한 3가지(지식 / 보유 / 생체)중 2가지를 사용해서 인증하는 것을 "2개 요소 인증"이라고 한다
3. 본인 자체의 것 (생체)
생체인식은 {지문, 자필서명, 자동 안면인식, 음성인식, 홍채인식, ....}등 굉장히 많은 종류가 있다
정보보안 분야에서 생체인식을 도입한 가장 큰 이유는 "Password 대체"를 위해서이다
Password는 간단하고 편리한 인증방법이지만 보안성이 그렇게 뛰어나지는 않다
이상적인 생체인식 조건
1. 보편성
생체인식은 "모든 사람에게 적용 가능"해야 한다
하지만 현실적으로 어떤 생체인식도 모든 사람들에게 공통적으로 적용하기는 힘들다
예를 들어 지문인식의 경우, 기타를 너무 오래쳐서 지문이 닳은 사람이 분명히 존재할 것이다. 이러한 사람에 대해서 지문인식은 불가능한 생체인식 방법이다
2. 구별성
생체인식은 "확실한 구별이 가능"해야 한다
하지만 100% 확실성을 기대하기는 힘들다
3. 영구성
생체인식의 측정 대상이 되는 신체는 "영구적이고 불변"해야 한다
4. 수집성
측정 대상이 되는 신체는 "상해 없이 간단하게 수집 가능"해야 한다
5. 신뢰성
실세계에서도 신뢰성이 존재해야 하고, 사용자에게 친숙하게 사용되어야 한다
생체인식 시스템 과정
생체인식 시스템은 총 2단계로 이루어진다
1단계) 등록
생체인식을 하려면 일단 생체 인식에 사용되는 "신체 정보"를 DB상에 저장해야 한다
따라서 측정을 할때는 굉장히 신중하게 측정해야 한다
측정하는 시간은 굉장히 오래걸릴 수 있고, 여러번 측정할 수도 있다
2단계) 인식
인식은 실제로 user가 인증을 할 때 사용한다고 보면 된다
예를 들어서 핸드폰 잠금 해제를 "지문인식"을 통해서 수행한다고 하자
근데 지문인식하는데 10분씩걸리고 5번 반복해서 인증한다면 누가 지문인식을 활용할까
따라서 인식단계는 굉장히 신속해야 하고 간단해야 한다
오류의 종류
생체인식의 오류에는 총 2가지가 존재한다
1) Fraud Rate (기만율)
Fraud Rate란 "다른사람이 나로 인증"되는 것을 의미한다
2) Insult Rate (모욕률)
Insult Rate란 "내가 인증을 했는데 시스템이 나를 안믿는 경우"를 의미한다
기만율과 모욕률은 서로 반비례 관계이고, 둘이 같아질 때의 비율을 "동일 오류율 : Equal Error Rate"라고 한다
생체 인식 1) 지문인식
지문은 사람들마다 보유한 "유일한 신체 정보"이다
그리고 외부의 요인을 제외하고 보면 지문은 영원히 변하지 않는 불변성을 가지고 있다
생체 인식 2) 손
손은 지문만큼 유일하지는 않지만, 측정이 쉽고 간단하다
하지만 불일치의 확률이 존재한다
손은 왼손/오른손이 대칭적이기 때문에 "등록"을 오른손으로 해도 "인식"과정에서는 왼손/오른손 중 어느 손을 써도 상관없다
생체 인식 3) 홍채인식
홍채 패턴은 유전적 영향이 거의 없고, 일생동안 변하지 않고, 사람들마다 보유한 "유일한" 특성이다
홍채 코드는 "해밍 거리 : Hamming Distance"로 계산한다
y를 "등록 단계의 홍채 스캔값"이라고 하고, x를 "인식 단계에서 홍채 스캔 값"이라고 하자
>> Hamming Distance : D(x, y)
D(x, y)는 "y를 기준으로 x가 얼마나 다른가"를 비율로 표현한 값이다
D(1011, 0111) = 2/4
D(101111, 101001) = 6/2
D(0010, 0101) = 3/4
d(x, y) = 0인 경우를 완전한 일치라고 하는데 이는 불가능하다
동일한 홍채에 대해서도 보통 0.08의 해밍 거리가 나온다
서로 다른 홍채에 대해서는 예상되는 해밍 거리는 약 0.50정도 된다
일반적으로 "인증 성공"이라고 볼 수 있는 해밍 거리는 0.32 미만이다
그러면 홍채인식 시스템에 대한 공격은 불가능할까?? 가능하다
Trudy가 Alice인척 홍채 인식을 하려고 "Alice의 사진"을 준비했다
Trudy는 홍채인식 시스템에 Alice의 사진을 갖다 대었다 >> 과연 시스템은 인증을 해줄까??
결과적으로 Trudy는 인증에 성공했다
이러한 문제점을 해결하기 위해서 홍채인식 시스템에서는 scanning을 하기 전에 "빛"을 쏴본다
만약 실존 인물이라면 홍채에 빛을 맞으면 당연히 깜빡일 것이다
하지만 사진이라면 빛을 아무리 맞아도 깜빡거릴 수가 없다