저는 서버 관리자가 네트워크 전체에서 스크립트 결과를 분석할 수 있도록 Linux에서 일부 맬웨어 탐지 스크립트용 GUI 도구를 만들고 있습니다.
/etc/shadow에 사용된 암호화가 강력하다는 것을 알고 있는 한, 내 애플리케이션의 루트에 동일한 비밀번호를 사용하고 /etc/shadow의 변경 사항을 확인하고 db의 루트 비밀번호를 동기화하고 루트 자격 증명을 사용하여 관리 관리자 로그인을 허용하고 싶습니다. .
PHP를 사용하여 개발하겠습니다. 이것이 정확히 어떤 암호화를 사용하는지, 그리고 사람들이 루트 자격 증명을 사용하여 PHP에서 내 GUI에 로그인할 수 있도록 PHP에서 동일한 기능을 구현할 수 있는지 궁금합니다.
답변1
비밀번호 필드의 값은 $XY$
숫자인 X로 시작하거나 두 DES(길이에 따라 표준 또는 확장) 중 하나입니다.
DES는 더 이상 안전하지 않기 때문에 거의 지원되지 않습니다. 다음 지정 Y
에 따라 선택 사항 입니다 (두 번째 항목 이후 ).X
$
1
: CRYPT_MD5( Y
null)
2
: CRYPT_BLOWFISH( 또는 일 Y
수 있음 ) : CRYPT_SHA256 : CRYPT_SHA512a
x
y
5
6
가장 흔히 접할 수 있는 $6$
것은 계산이 res = sha(res + salt)
처음부터 반복(표준 5000회) 적용을 기반으로 한다는 것입니다 res = password
. 다른 라운드 수를 지정하고 솔트 앞에 저장할 수 없는 한 솔트는 두 번째 $
부터 세 번째까지 이어집니다.$
$6$salt$result
$6$rounds=N$salt$result
(첫 번째는 5000 라운드를 의미합니다).
확실히 이것을 직접 구현할 수 있지만 PHP의 crypt가 사용할 알고리즘 지정을 지원하는지 확인하거나 다른 방식으로 호출을 살펴보겠습니다(예: Ubuntu의 패키지에서 mkpasswd
).whois
이 모든 것이 작동한다는 점을 고려하면 HTTPS를 통하지 않더라도 루트 계정과 비밀번호를 사용하지 않는 것이 좋습니다. PHP가 손상된 경우 시스템의 루트 비밀번호를 스누핑하기 위해 무언가를 삽입하는 것은 매우 쉽습니다.
답변2
사람들이 루트 자격 증명을 사용하여 PHP에서 내 GUI에 로그인하도록 할 수 있습니까?
GUI 프로세스에 루트 자격 증명이 있다는 뜻이라면 그렇습니다. 이는 요구사항입니다. passwd
이를 수행하는 다른 것들은 다음과 같습니다.setuid 비트루트가 설정하고 소유합니다. PHP를 사용하여 이를 수행하는 방법에 대한 지침이봐.
먼저 비밀번호에 대한 기본 사실을 명확히 확인하세요. 아마 이미 알고 계시겠지만, 비밀번호아니요시스템에 저장됩니다. 단방향 해시는 다음과 같습니다. 단방향 해시는 암호화 알고리즘을 사용하여 소스 문자열(예: 실제 비밀번호)에서 생성할 수 있는 문자열입니다.해시에서 소스를 다시 만들 수 없습니다..
이는 누군가가 비밀번호를 알아내더라도 /etc/shadow
사용자의 비밀번호를 재구성할 수 없음을 의미합니다. 암호화는 방법이므로 되돌릴 수 없습니다. 그러나 문자열을 가져와 동일한 방식으로 암호화하고 해시와 비교할 수 있습니다. 이것이 비밀번호 확인이 이루어지는 방식입니다.
해시 문자열의 구조 /etc/shadow
는 다음과 같이 설명됩니다.Anton의 답변은 훌륭합니다.. 다음은 C 언어로 구현한 기본적인 인증 과정이다. PHP는포장지getpwnam()
아니면 /etc/shadow
직접 구문 분석하고 저장할 수도 있습니다. 문자열이 수행하는 작업을 이해하려면 crypt()
(Anthon이 언급했듯이 여기에는 사용된 알고리즘과 해시를 생성하는 데 사용된 "소금"에 대한 표시가 포함되어 있음) 다음을 참조하세요.주석->Glibc 주석존재하다 man 3 crypt
. PHPcrypt()
문서는 덜 명확하지만 동일한 방식으로 작동하는 것 같습니다.
유일하게 중요한 기능은 getpwnam()
및 이며 crypt()
, 다른 기능은 단지 기본적인 입력, 출력 및 문자열 작업입니다.
#define _XOPEN_SOURCE // Important.
#include <errno.h>
#include <crypt.h>
#include <shadow.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main (int argc, const char *argv[]) {
if (argc < 2) {
puts("Username required.");
return 1;
}
// Get shadow password.
struct spwd *spw = getspnam(argv[1]);
if (!spw) {
if (errno == EACCES) puts("Permission denied.");
else if (!errno) puts("No such user.");
else puts(strerror(errno));
return 1;
}
// Read password from user.
fprintf(stderr, "%s> ", argv[1]);
char buffer[4096];
int len = read(0, buffer, 4095);
// Ditch the newline.
buffer[len - 1] = '\0';
// Hash and report.
char *hashed = crypt(buffer, spw->sp_pwdp);
printf("%s\n%s\n", spw->sp_pwdp, hashed);
if (!strcmp(spw->sp_pwdp, hashed)) puts("Password matched.");
else puts("Password DID NOT match.");
return 0;
}
다음과 같이 컴파일할 수 있습니다.
gcc --std=c99 whatever.c -o testpw -lcrypt
루트로 실행해야 합니다. 그렇지 않으면 "권한 거부" 메시지가 표시됩니다. 실제 사용자 이름을 지정해야 합니다.
./testpw me
에코는 비활성화되지 않으므로 비밀번호를 입력할 때 비밀번호가 표시됩니다.
답변3
/etc/shadow의 구조는 다음을 참조하세요.http://www.cyberciti.biz/faq/understanding-etcshadow-file/ 암호화에 관해서는 Linux가 Crypt 알고리즘을 사용한다고 확신합니다.http://linux.die.net/man/3/crypt그리고http://php.net/manual/en/function.crypt.php)
답변4
비밀번호는 암호화되지 않습니다. 그들은 소금으로 해시됩니다.
이 형식은 문자열의 일부로 알고리즘 사양을 가짐으로써 다양한 해싱 알고리즘에 사용되거나 지원됩니다 /etc/passwd
. /etc/shadow
해시 문자열의 생성과 확인은 모두 crypt
입력 문자열을 기반으로 적절한 알고리즘을 자동으로 선택하는 이 함수를 사용하여 수행됩니다.
PHP에는 기능이 있지만 crypt
귀하의 사용 사례에서는 사용하지 않는 것이 좋습니다.
루트 권한으로 웹 서버에서 코드를 실행하는 것은 매우 위험합니다. 단 하나의 작은 실수만으로도 시스템이 공격에 취약해집니다.
대신, 시스템에서 표준 suid 유틸리티 중 하나를 실행하여 PHP 스크립트에 루트 권한을 얻는 것이 좋습니다. 이 유틸리티는 루트 비밀번호가 제공되면 루트 권한을 부여할 수 있습니다. 이 su
명령이 가장 적합할 수 있습니다.
시스템이 해시된 루트 비밀번호를 에 저장하도록 구성된 경우 /etc/passwd
스크립트는 이를 읽고 crypt를 사용하여 사용자가 입력한 비밀번호를 확인할 수 있습니다. 그러나 이렇게 할 이유가 별로 없으며 /etc/shadow
사용하면 작동하지 않습니다. 대신 사용자가 입력하는 비밀번호를 전달 su
하고 응답을 통해 su
비밀번호가 올바른지 알아보세요.