OpenVPN 은 기본적으로 사용자별로 인증서를 생성해서 연결하도록 하고 있다.
그러다보니 설정파일에 ca, tls-auth, cert, key 4개의 파일이 추가로 따라다니게 되는데 관리하기 조금 번거로운 면이 있다.
물론 각각 ovpn 파일안에 임베딩해버릴 수 있지만...
아이디, 비밀번호로 로그인하는 방법이 있길래 진행해보았다.
먼저 OpenVPN 서버 설정에서 아래 두 문구를 추가한다.
첫번째 줄은 클라이언트 인증서가 필요없게 하는거고, 두번째줄은 비밀번호를 체크할 스크립트를 지정한다.
저 파일은 내가 만들어줘야하며, 경로는 어디두던 크게 상관없음.
다만 user nobody / group nogroup 설정을 했을 경우 OpenVPN 데몬이 nobody / nogroup 권한으로 작동하기 때문에, 권한에 유의해주면 된다. 읽기 권한이나 실행 권한 등이 없으면 비밀번호 체크를 할 수 없다.
비밀번호 체크 과정에 root 권한이 필요하다면 권한을 낮추는 해당 설정을 제거해주자.
스크립트 경로 뒤의 via-file 은 OpenVPN 에서 사용자가 입력한 아이디와 비밀번호를 넘겨줄 방식을 정한다.
via-file 로 할 경우 임시 파일을 생성하면서
이렇게 두 줄로 된 파일을 생성한다.
(via-env 로 할 경우 환경변수에 넣어준다는데, 사용자명은 들어오는데 비밀번호는 어디있는지 모르겠더라...)
해당 스크립트에서 아이디와 비밀번호를 읽어서, 성공했다면 exit 0 을, 실패했다면 에러코드와 함께 프로그램이 종료되면 된다.
이제 비밀번호 체크를 위한 스크립트를 만들자.
방식은 다양하니 직접 만들면 되겠지만 내 스크립트를 참고 삼아 올려둠.
아래 URL 에 들어가보면 다른 스크립트들도 있다.
나는 user.pass 파일에
꼴로 저장을 해두고, 이를 검사하는 방식으로 작성하였다.
verify.sh 코드는 이렇게.
그리고 client 설정 파일에는 cert 와 key 를 없애고, auth-user-pass 옵션을 추가해주면 된다.
----------
이 다음으로, Local 사용자 계정으로 로그인하는걸 시도해보았다.
보통 shadow 파일을 읽어서 비교를 많이 하던데, 나는 PAM Authentication 을 이용해보았다.
PAM 인증을 할때 root 이어야만 제대로 작동하는 것 같으니, 서버 설정에서 user nobody 옵션은 주석처리 해주자. (혹은 스티키 비트를 넣어주거나..)
PAM 인증을 하는 c 프로그램을 제작하였고, 로그를 남기기 위해 간단한 쉘 스크립트를 같이 이용하였음.
verify.sh
pam_auth.c ( https://gist.github.com/iolate/a58b73a023b35d5f181814de2f4ffccd )
pam_auth 를 컴파일하기 위해선 pam development 패키지가 필요하니 설치하고 컴파일 해주자.
Ubuntu 기준 아래의 방법으로 진행하면 됨.
verify.sh 를 간단히 수정하면, 두가지 방식을 동시에 사용하는 것도 가능하다.
참고
https://forums.openvpn.net/viewtopic.php?t=24907
https://medium.com/@nqbao/openvpn-auth-user-pass-verify-example-8d99023f08f7
'Linux, Server, Web' 카테고리의 다른 글
AWS Lambda Python 패키지 포함하기 + 배포 스크립트 (0) | 2019.07.17 |
---|---|
OpenSSL 로 OpenVPN 용 인증서 생성하기 (0) | 2019.03.08 |
Ubuntu 18.04 NIS 문제 해결 (0) | 2019.02.18 |
Apache Guacamole Docker 설치 (RDP, VNC, SSH 웹 클라이언트) (4) | 2019.02.03 |
[Ubuntu 18.04] KVM 설치 및 사용하기 (3) | 2019.02.01 |