Skip to content

Latest commit

 

History

History
307 lines (166 loc) · 12.5 KB

SCRIPT.md

File metadata and controls

307 lines (166 loc) · 12.5 KB

Slide 1

안녕하세요. 동아리 방에 지금 누가 있나요? FreeRadius부터 ARP 스캐너까지 에 대해서 발표할 전상완이라고 합니다. 같이 한번 들어가 보시죠

Slide 2

저는 전상완이고요 연세대학교 전기전자공학과 학부생이며 연세대학교 중앙 컴퓨터 동아리 YCC, Yonsei Computer Club의 임원진으로 활동하고 있습니다.

For foreigners listening to my presentation, I tried my best to add english texts along with the korean ones. I hope you can understand what I'm saying.

옆에 있는 QR 코드는 Q&A 사이트로 연결되는 코드입니다. 제 강의를 들으시면서 궁금한 점이 생기면 여기에 남겨주시면 될 것 같습니다.

Slide 3

이제 발표 주제는 다음과 같습니다. 동아리방에 있는 와이파이에 802.1x를 적용하는 방법 그리고 와이파이를 이용해 동아리 방에 누가 있는지 실시간으로 확인할 수 있는 서비스를 구축하는 방법에 대해서 설명하고자 합니다.

Slide 4

모든 서비스는 그리고 모든 시스템은 모든 프로그램은 필요에 의해서 만들어집니다. 그래서 저는 발표를 시작하기 전에 이런 게 왜 필요했는지 좀 먼저 얘기를 하고 싶어요. 일단 그런 게 왜 필요했는데 라고 물어보시면 저는 이유를 두 가지로 설명을 할 건데요.

첫 번째 이유는 회원수 188명의 대형 동아리였기 때문입니다. 저희 공지방 보시면 저기 작게 보이시겠지만 188명이 있는 걸 아실 수 있어요. 중앙 동아리이기 때문에 다양한 사람들이 되게 많습니다.

Slide 5

또한 저희는 비밀번호 유출 사건이 있었어요. 그래서 옆에서 우리 와이파이 비밀번호를 훔쳤다라는 증언도 있었고 기록도 있었고 그래서 비밀번호 유출 사건이 생겨서 이거에 대한 대응책이 필요했습니다.

Slide 6

그래서 이에 대응하기 위해서는 주기적으로 비밀번호를 바꾸는 방법이 있겠죠.

Slide 7

아니면 부원마다 다른 비밀번호를 줄 수 있겠냐라는 얘기를 누군가가 하더라고요

Slide 8

또 다른 이유로는 이제 동방에 누가 있는지 계속 물어봐요. 뭐 이렇게 계속 똑같은 질문을 반복하게 됩니다.

이거에 대해서 누군가가 대답을 해주면 참 좋겠는데 대답을 안 해주면 답답하기도 하고 그 대답을 항상 기다릴 수도 없는 거잖아요. 항상 카톡을 보고 있을 일도 아닌 거고 그래서 저는 이런 게 있으면 참 좋겠다라는 굉장히 많은 사람들의 요구가 있었고 저도 있으면 참 좋겠다는 생각을 했어요.

Slide 9

일단 먼저 저희는 비밀번호 유출 문제를 해결하기로 했습니다.

Slide 10

해결 방법들은 뭐 간단하죠. 주기적으로 비밀번호를 바꾸는 방법이 있겠죠.

Slide 11

근데 안 하기로 했습니다.

Slide 12

그리고 부원마다 다른 비밀번호를 부여하기로 했어요. 왜 그랬을까요. 왜 그랬냐면 주기적으로 비밀번호를 바꾸면 어떻게 해야 될까요.

항상 오는 사람들한테 비밀번호 뭐예요라고 물어봐 질문을 받겠고 그러면 그때마다 또 기억이 안 나면 또 찾아봐야 되고 그리고 또 이렇게 주기적으로 바꾸는 비밀번호는 또 규칙성이 없을 가능성이 높잖아요. 그냥 여러분 랜덤 스프링 같은 거 만들어서 올리겠죠. 그러면 또 그걸 또 찾아봐야 되고 그걸 항상 또 바꿔줘야 되고 되게 불편합니다. 그래서 무엇마다 다른 비밀번호를 부여할 수 있는 방법을 찾게 됐어요.

Slide 13

그래서 와이파이의 인증 방식을 좀 알아봤거든요.

Slide 14

그렇죠 처음에는 오픈 그래서 비밀번호가 없는 와이파이로 누구나 접속 가능해요. 근데 이거는 아시다시피 자원이라는 게 리소스라는 게 되게 한정적입니다. 그래서 저희는 학교에서 주는 회전을 쓰기 때문에 그래서 대역폭이 정해져 있어요. 그래서 한 번에 왔다. 갔다. 할 수 있는 속도가 100Mbps 정도로 정해져 있는데 이게 사람이 많이 쓰면 쓸수록 당연히 대부분은 한 사람당 받을 수 있는 대부폭은 줄겠고 그러면 인터넷이 느려지는 문제가 발생합니다. 그렇기 때문에 저희는 오픈 그러니까 비밀번호가 없는 와이파이는 쓰고 싶지 않았습니다.

Slide 15

그래서 저희가 일반적으로 쓰던 거는 비밀번호가 있는 와이파이였어요. 근데 그래서 비밀번호를 알면 접속이 가능하고 근데 비밀번호 유출 시에 저희가 뭐 할 수 있는 방법이 없죠. 그냥 비밀번호를 바꿔야겠죠. 이거를 공식적인 기술 용어로 psk라고 하더라고요 Pre Shared Key라고 해서 PSK라고 하고요,

Slide 16

이제 다른 방법으로는 eap라고 그래서 Extensible Authentication Protocol이라고 그래서 로그인 방식의 와이파이인데 개인에게 할당된 비밀번호가 다 다릅니다. 사용자 이름과 암호를 입력하기 때문에 그 사용자 이름과 암호 쌍이 일치해야지 로그인을 할 수 있습니다.

그러니까 비밀번호를 유출했을 때 모든 사람의 비밀번호를 바꿀 필요가 없는 거예요. 그 유출된 사람의 비밀번호만 바꾸면 됩니다.

Slide 17

그래서 802.1x에 대해서 좀 찾아보게 됐는데요. 그래서 로컬 연결 네트워크에서 상대 기기와 연결하는 기기에 대한 인증을 제공하는 방식을 정의한 표준이라고 해요.

Slide 18

이게 제가 쓰는 와이파이에 지원을 할까라고 생각을 해서 궁금했으니까 그래서 찾아봤는데 저기 딱 보시면 802.1x 보안이라고 되어 있고 아래 보시면 이제 RADIUS 서버 그리고 암호를 입력하게 되어 있어요.

Slide 19

그래서 저는 여기서 궁금하기 시작했죠. RADIUS 서버가 뭘까요. 저도 사실은 몰랐어요. RADIUS 하면 저는 반지름밖에 몰랐으니까요. 그래서 RADIUS 서버를 찾아보기 시작했습니다.

Slide 20

RADIUS 서버는 Remote Authentication Dial in User Service라는 약자예요.

Slide 21

반지름밖에 몰랐는데 네트워크 자원에 대한 접근을 인증하고 허가하며 관리하는 트리플 A 그래서 Authentication, Authorization, Accounting해주는 서버입니다.

Slide 22

즉 802 1x에 의해서 인증을 담당하는 서버입니다.

Slide 23

그러면 RADIUS 서버가

Slide 24

802.1x를 인증을 담당하기 위해서는 어떤 정보들이 있어야겠죠.

Slide 25

이걸 보통 User Federation 그러니까 유저의 정보를 제공하는데 소스가 파일이 될 수도 있고

Slide 26

아니면 LDAP이나 SQL 데이터베이스가 될 수도 있어요.

Slide 27

근데 LDAP을 저희는 쓰기로 했습니다.

Slide 28

그럼 또 여기서 궁금해지죠 LDAP은 뭘까

Slide 29

LDAP은 Lightweight Directory Access Protocol이에요.

Slide 30

왜 엘답을 써야 되냐 와디스를 포함한 여러 서비스들이 유자 페드레이션 용도로 사용합니다. 대표적으로 Keycloak이 LDAP을 User federation 용도로 사용할 수 있게 되었어요. Keycloak은 이제 SAML이나 OAuth 아니면 OIDC와 같은 SSO를 전담하는 서버입니다.

Slide 31

LDAP Entry Structure를 좀 보면 이제 Object Class가 이렇게 정의되어 있고 이거에 대한 Key Value 쌍으로 이렇게 되어 있는 것을 보실 수 있어요.

Slide 32

그러면 이거를 일단 이렇게 알고 이제 컨테이너를 구축을 해보아야겠죠. 저는 Docker compose를 만들 때 이렇게 네 가지 컨테이너를 만들었어요.

Slide 33

일단 먼저 Certbot입니다. CertBot은 OpenLDAP의 TLS 설정에 필요한 Certificate를 발급하고 갱신합니다.

그래서 Entrypoint에서 Certificate의 존재를 확인하고 없으면 발급하고 발급 후에는 컨테이너 상태를 healthy로 변경해서 이제 다른 다른 컨테이너들이 켜질 수 있도록 신호를 주고요 그리고 24시간마다 Certificate 갱신을 시도합니다.

Slide 34

Slide 35

PostgreSQL은 FreeRADIUS 인증 기록과 Accouting 기록을 저장합니다.

이제 초기화 시에 FreeRadius Table을 초기화 해줄 수 있는 스크립트가 들어간 initdb.d 폴터를 mount 해 주었습니다.

Slide 36

Slide 37

OpenLDAP입니다. 이제 FreeRADIUS를 통해 접근할 수 있는 유저의 정보를 저장하는 겁니다. 그래서 User Federation 용도로 사용하고요 Entrypoint는 기본 Organization과 Readonly 유저를 생성하고 Samba 스키마를 적용했습니다.

Slide 38

Slide 39

FreeRadius는 이제 802.1x 인증을 위한 RADIUS 서버입니다. 그래서 RADIUS 서버 설정을 덮어 씌우고 LDAP, Counter, SQL 모듈 활성화를 해줬습니다.

Authentication 포트인 1812번 포트와 Accounting 포트인 1813번 포트를 열어줬습니다.

Slide 40

패스워드 해시가 문제가 있었어요. 이제 행은 인증 프로토콜이고 열은 저장하는 해시의 종류인데요. 이제 윈도우즈에서 기본적으로 지원하는 프로토콜이 PEAP, SIM, TTLS, AKA, AKA 프라임이 있는데 SIM은 이제 유심에 들어가 있는 기기들에 대해서 인증을 하는 것입니다. 뭐 예를 들어서 T wifi zone secure이라든지 아니면 U+ WiFi Zone 이런 데에서는 그 통신사에 가입된 사람만 이렇게 접속을 할 수 있게 돼있잖아요, 이게 EAP-SIM을 이용해서 접속을 하는 거거든요.

이런 거는 해당이 안 되니까 패스, TTLS도 Cert 파일과 키를 배포해야 되는데 그거는 불편하니까 패스 AKA도 해당 사항이 없습니다. 그래서 저희가 쓸 수 있는 거는 PEAP, Protected Extensible Authentication Protocol 밖에 없어요.

Slide 41

다시 볼게요 PEAP는 가능한 Hash가 NT Hash, nltm auth밖에 없습니다.

Slide 42

그래서 NT Hash를 따로 저장을 해야 돼요 근데 어디에 저장하죠.

Slide 43

기본적으로 저희가 만약에 아무런 스키마를 넣지 않고 답을 초기화를 시켰을 때 패스워드를 저장할 수 있는 데가 유저 패스워드밖에 없어요. olc로 시작하는 것들은 이제 LDAP에 들어가는 특정한 특수한 거기 때문에 저희가 쓸 수는 없습니다.

Slide 44

Samba라는 것이 있습니다.

Slide 45

윈도우의 파일공유 프로토콜인 SMB 프로토콜을 재 구현한 것인데요

Slide 46

해당 프로토콜을 LDAP에서 지원하기 위해 만든 Schema에 sambaNTPassword라는 것이 있습니다. 적당하기 때문에 여기에 저장하기로 했습니다.

Slide 47

이제 동방에 누구입니다.

Slide 48

다 했어요. RADIUS Accounting만 쓰면 됩니다.

Slide 49

즐겁게 데이터베이스를 열어봤더니... RADIUS Accounting이 기록되지 않습니다. 어쩌죠...

Slide 50

다행인건 RADIUS Authentication 기록은 남아 있는걸 확인했어요.

Slide 51

정리해 보자면, 우리가 아는 것은

Slide 52

접속 시간과

Slide 53

MAC 주소

Slide 54

사용자 ID는 알고 있습니다

근데 저희는

Slide 55

현재 접속 여부를 모릅니다. 정확히는 연결이 끊긴 시간을 알 수 없습니다.

Slide 56

Ping을 써 볼까요?

Slide 57

하지만 Ping은 IP가 필요합니다.

Slide 58

MAC 주소도 알 수 없죠

Slide 59

그때 문득 ARP가 떠올랐습니다.

Slide 60

비효율적인 방법이지만, 네트워크 서브넷에 있는 모든 IP에 Ping을 보내고 ARP 테이블을 확인하면 될 것 같았습니다.

Slide 61

저는 Docker를 참 좋아합니다.

Slide 62

근데 이번에는 네트워크가 Host와 분리되어 있으며 ARP Cache를 Flush 할 수 없어서 못 쓴다는 것을 알게 되었습니다.

Slide 63

그래서 다른 방법을 찾아봤습니다. 동아리방에 굴러다니던 Raspberry Pi가 눈에 띄었어요.

Slide 64

Go를 이용하여 간단한 벡엔드 서버를 짜고,

Slide 65

Raspberry Pi에 Service로 올려 놓았습니다.

Slide 66

이렇게, 저는 문제를 해결했습니다. 이제 핸드폰으로 QR코드를 스캔하셔서 직접 확인해 보세요

Slide 67

이상으로, 발표를 마치겠습니다. 들어주신 모든 분께 감사드립니다.