전체 공개:
나는 스스로 대답하기 위해 이 질문을 쓰고 있습니다. 하루 종일 인터넷을 검색했지만 나에게 맞는 솔루션을 찾을 수 없습니다. 더 많은 로깅을 추가하기 위해 자체 GoogleAuthenticator PAM 모듈을 컴파일하기도 했습니다. OpenVPN 프로세스와 그 하위 프로세스를 실행 하지 않고도
strace
솔루션을 찾았습니다 .
사용 사례
- EC2에서 OpenVPN을 사용하여 VPN 시작
- PAM GoogleAuthenticator 모듈 사용
- 운영 체제: CentOS
설정
- EC2에 로그인
- 클라이언트 만들기
- 제공된 토큰 생성기를 사용하여 사용자(클라이언트)에게 MFA 토큰을 추가하고 이 토큰을 PAM 모듈이 감지할 수 있는 올바른 위치에 저장합니다.
<user>.ovpn
이 사용자를 위한 파일 만들기
다음 스크립트는 Linux 사용자를 생성한 다음 MFA 키를 생성하고 이를 PAM 구성에 지정된 위치에 저장합니다. 권한은 600
제가 MFA_USER
생성한 사전 생성된 사용자 이름입니다.gauth
function generate_mfa() {
user_id=$1
if [ "$user_id" == "" ]; then
echo "ERROR: No user id provided to generate MFA token" >&2
exit 1
fi
echo "INFO: Creating user ${user_id}" >&2
useradd -s /bin/nologin "$user_id"
echo "> Please provide a password for the user" >&2
passwd "$user_id"
echo "INFO: Generating MFA Token" >&2
google-authenticator -t -d -r3 -R30 -f -l "${MFA_LABEL}" -s "${MFA_DIR}/${user_id}"
chown "${MFA_USER}:${MFA_USER}" "$MFA_DIR/${user_id}"
chmod 600 "${MFA_DIR}/${user_id}"
}
OpenVPN PAM 구성
auth required /usr/lib64/security/pam_google_authenticator.so secret=/etc/openvpn/google-authenticator/${USER} user=gauth forward_pass
auth include system-auth use_first_pass
account include system-auth use_first_pass
password include system-auth use_first_pass
session include system-auth use_first_pass
auth required pam_deny.so
질문
- 내 로 구성된 Tunnelblick을 사용하면
client.ovpn
내 사용자 이름과 비밀번호로 로그인하라는 메시지가 표시됩니다.- 비밀번호의 형식은 inline: 이며 지시문에 의해
<password><MFA_TOKEN>
제거 됩니다.forward_pass
- 비밀번호의 형식은 inline: 이며 지시문에 의해
- 올바른 자격 증명을 입력했지만 계속 승인되지 않은 메시지가 나타납니다.
통나무
- 내 문제를 확인하기 위해 SSH를 통해 VPN 인스턴스에 로그인하고 PAM/인증 로그를 확인했습니다.
tail /var/log/secure
Sep 10 22:33:43 ip-OMITTED openvpn(pam_google_authenticator)[12862]: Accepted google_authenticator for ryan
Sep 10 22:33:43 ip-OMITTED openvpn(pam_google_authenticator)[12862]: Failed to update secret file "/etc/openvpn/google-authenticator/ryan": Permission denied
아하! "허가가 거부되었습니다"
그런 다음 내 권한을 확인하십시오.
[root@ip-OMITTED centos]# ls -lah /etc/openvpn/google-authenticator/
drwxr-xr-x. gauth gauth .
drwxr-xr-x. root root ..
-rw-------. gauth gauth ryan
- 음, 권한이
600
올바른 것 같습니다. 이 디렉터리는 실행 가능하며gauth
PAM 구성에서 이 사용자를 사용합니다.
내 구성에 어떤 문제가 있나요?
- 사용자가
gauth
존재합니다:check:
- 권한이 정확합니다
:check:
답변1
아하 순간
.
내 권한 목록 끝에 있는 항목은 무엇인가요?
[root@ip-OMITTED centos]# ls -lah /etc/openvpn/google-authenticator/
drwxr-xr-x. gauth gauth .
drwxr-xr-x. root root ..
-rw-------. gauth gauth ryan
...Searchin' the web...
- 이라는 게 있는 것 같더라구요SELinux(보안이 강화된 Linux)
저것ls -lah
파일에 대한 특수 컨텍스트/ACL 콘텐츠가 있음을 나타내는 런타임 파일 권한 끝에 있는 점입니다 .
바라보다:SELinux 문서
따라서 컨텍스트를 보려면 다음을 수행하십시오.
ls -Z
일단 로그인하기 전에
파일 컨텍스트는unconfined_u:object_r:openvpn_etc_t:s0
[root@ip-OMITTED centos]# ls -lahZ /etc/openvpn/google-authenticator/
drwxr-xr-x. gauth gauth unconfined_u:object_r:openvpn_etc_t:s0 .
drwxr-xr-x. root root system_u:object_r:openvpn_etc_t:s0 ..
-rw-------. gauth gauth unconfined_u:object_r:openvpn_etc_t:s0 ryan
- 그런 다음 일시적으로 selinux를 비활성화했습니다.
setenforce 0
한 번의 로그인 후
파일을 쓸 수 있고 컨텍스트가 강제로 작성됩니다. system_u:object_r:openvpn_etc_rw_t:s0
[root@ip-OMITTED centos]# ls -lahZ /etc/openvpn/google-authenticator/
drwxr-xr-x. gauth gauth unconfined_u:object_r:openvpn_etc_t:s0 .
drwxr-xr-x. root root system_u:object_r:openvpn_etc_t:s0 ..
-r--------. gauth gauth system_u:object_r:openvpn_etc_rw_t:s0 ryan
SELinux를 다시 활성화합니다.
setenforce 1
아직 로그인할 수 있습니다. :)
SELinux가 켜져 있을 때 파일을 복구하려면 다음 명령을 실행하세요.
semanage fcontext -a -t openvpn_etc_rw_t "${MFA_DIR}/${user}"
restorecon "${MFA_DIR}/${user}"
- 이것은
rw
비트를 허용합니다!