나는 이 질문에 대한 답변을 읽었습니다.
https://stackoverflow.com/questions/4102763/apache-basic-authentication-book-for-those-allowed
IP 기반으로 특정 사용자를 인증하지 않는 방법을 이해하는 데 도움이 되었습니다.
<Directory /var/www/files/>
Require valid-user
Allow from 192.168.1.2
Satisfy Any
AuthUserFile /etc/apache2/basic.pwd
AuthName "Please enter username and password"
AuthType Basic
</Directory>
다음 데이터베이스가 있다고 가정해 보세요(인증에 사용되는 데이터베이스와 다름).
User IP
Mark 192.168.1.2
Mike 192.168.1.3
Karl 192.168.1.4
1- Apache의 구성을 사용하여 데이터베이스에 저장된 모든 IP 주소를 허용할 수 있습니까? 정적 솔루션이 필요하지 않습니까(데이터베이스가 동적으로 변경됨)?
2- 또 다른 문제는 허용된 IP에 대한 인증이 손실된다는 것입니다. 사용자가 인증 없이 페이지를 가져오도록 허용된 경우 Apache가 인증을 위해 이 데이터베이스를 사용할 수 있습니까? 세부 정보: Apache가 사용자를 인증할 때 사용자 이름 인증 자격 증명을 알고 있지만 허용되면 사용자 이름이 손실되고 Apache가 동일한 테이블에서 허용된 IP를 가져오도록 하고 싶습니까? 사용자 이름에서 IP 주소를 가져옵니다.
고쳐 쓰다:
참고: 내 생각엔토니답변이 도움이 될 수 있지만 다른 답변도 원합니다(모듈을 작성할 필요는 없음).
이 질문에 대한 나의 목표는 "Single Sign-On"입니다.
나는 사용한다자유 반경내부(네트워크 내부) 사용자는 인증되므로 Apache가 해당 사용자를 다시 인증하는 것을 원하지 않습니다.
Apache가 LDAP를 사용하여 외부 사용자를 인증하길 원합니다.
- 내 솔루션은 내부 사용자가 인증 없이 사용할 수 있도록 지시문을 사용하는 것입니다
Allow
. 그러나 내부 사용자가 데이터베이스를 사용할 수 있도록 허용해야 합니까(첫 번째 질문)? 그리고 내부 사용자에게 권한을 부여하도록 Apache를 구성하려고 합니까(인증하는 것이 아닙니다)(두 번째 질문)?
참고: 외부 사용자 인증은 사용이 매우 쉽습니다.LDAP(Apache는 인증 자격 증명을 통해 처리하는 사용자의 이름을 알고 있기 때문입니다.)
내가 제안하는 솔루션이 내가 하고 싶은 일에 적합한가요? 그렇지 않다면 어떤 솔루션을 제안하시나요?
답변1
시도해 봤어?모드 인증 외부, Apache에 대한 인증 메커니즘을 사용자 정의할 수 있습니다.
IP, USER, PASS 등과 같은 환경 변수에 대한 액세스를 제공합니다. 익숙한 언어로 스크립트를 작성하고 데이터베이스에서 인증 데이터를 가져올 수 있습니다.
Wikipedia에는 몇 가지 예가 있습니다.
사용자 정의 인증 스크립트를 작성하는 경우 보안 측면에서 잘 코딩되었는지 확인하세요.
이 모듈은 CentOS(mod_authnz_external) 및 Ubuntu(libapache2-mod-authnz-external)에서 사용할 수 있습니다.
다음은 기본 Apache 구성 예입니다.
LoadModule authnz_external_module modules.d/mod_authnz_external.so
DefineExternalAuth my_auth environment /tmp/auth.sh
<Location />
AuthType Basic
AuthName "My super special access"
AuthBasicProvider external
Require valid-user
AuthExternal my_auth
</Location>
이것은 IP, 사용자 이름 및 비밀번호를 기록하고 제공된 사용자가 "Tony"인 경우에만 인증을 허용하는 매우 간단한 스크립트입니다.
이 특정 예에서 스크립트는 실행 가능 비트가 설정된 /tmp/auth.sh 아래에 저장됩니다. 원하는 것은 무엇이든 할 수 있습니다(IP, 사용자 이름 등으로 필터링).
#!/bin/bash
echo $(date) ${IP} >> /tmp/log.txt
echo $(date) ${USER} >> /tmp/log.txt
echo $(date) ${PASS} >> /tmp/log.txt
#Very basic filtering.
if [[ "${USER}" != "Tony" ]]
then
exit 1;
fi