시스템 로그인 테스트는 어떻게 작성합니까? 성공적인 로그인을 테스트해야합니다. 테스트를 어떻게 작성합니까? 예를 들어

bash명령 을 호출하는 Python CGI 스크립트를 작성 했으며 호스트에서 성공적인 로그인을 테스트해야합니다.

테스트를 어떻게 작성합니까?

예를 들어 bash호스트에 등록 된 사용자에 대해 주어진 사용자 이름과 비밀번호 조합을 테스트 하는 스크립트를 만들 수 있습니까?



답변

PAM을 사용하는 것이 가장 좋습니다. 작은 C 코드를 작성하거나 python-pam 패키지를 설치하고 python-pam 패키지와 함께 제공되는 python 스크립트를 사용할 수 있습니다. 보다/usr/share/doc/python-pam/examples/pamtest.py


답변

사용자가 로그인 할 수 있는지 테스트하는 올바른 방법은 실제로 해당 사용자로 로그인하는 것입니다.

따라서 내가 추천하는 것은 CGI 스크립트를 사용 expect하여 실행 su하고 암호를 전달한 다음 실행해야하는 명령을 실행하는 것입니다. 다음은이 작업을 수행하는 expect 스크립트 초안입니다 (경고 : 절대적으로 테스트되지 않았으며 기대에 유창하지 않습니다). (내가 쓴 경우 사용자 이름, 암호 및 명령에 대체 bob, swordfishsomecommand); 정확하게 인용하십시오.

spawn "/bin/su" "bob"
expect "Password:"
send "swordfish\r"
expect "^\\$"
send "somecommand"
expect -re "^\\$"
send "exit\r"
expect eof

suCGI 프로세스 자체에서 수행해야하는 작업 과 같이 계층을 통해 명령을 실제로 실행하지 않으려면 expect 명령을 실행 true하고 반환 상태가 0인지 확인하십시오.

또 다른 방법은 Python의 PAM 바인딩을 통해 응용 프로그램에서 직접 PAM 을 사용하는 것 입니다.


답변

보다 구체적으로 대답하려면 : “호스트의 등록 된 사용자에 대해 지정된 사용자 이름 및 비밀번호 조합을 테스트하는 bash 스크립트를 작성할 수 있습니까?”

예.

#!/bin/bash
uid=`id -u`

if [ $uid -ne 0 ]; then
    echo "You must be root to run this"
    exit 1
fi

if [ $# -lt 1 ]; then
    echo "You must supply a username to check - ($# supplied)"
    exit 1
fi

username=$1
salt=`grep $username /etc/shadow | awk -F: ' {print substr($2,4,8)}'`

if [ "$salt" != "" ]; then

        newpass=`openssl passwd -1 -salt $salt`
        grep $username  /etc/shadow | grep -q  $newpass && echo "Success" || echo "Failure"

fi


답변

여기에 인용 된 ‘C’, ‘Python’PAM 솔루션이 있습니다.

출처 : http://search.cpan.org/~nikip/Authen-PAM-0.16/PAM/FAQ.pod#1._Can_I_authenticate_a_user_non_interactively ?

#!/usr/bin/perl

  use Authen::PAM;
  use POSIX qw(ttyname);

  $service = "login";
  $username = "foo";
  $password = "bar";
  $tty_name = ttyname(fileno(STDIN));

  sub my_conv_func {
    my @res;
    while ( @_ ) {
        my $code = shift;
        my $msg = shift;
        my $ans = "";

        $ans = $username if ($code == PAM_PROMPT_ECHO_ON() );
        $ans = $password if ($code == PAM_PROMPT_ECHO_OFF() );

        push @res, (PAM_SUCCESS(),$ans);
    }
    push @res, PAM_SUCCESS();
    return @res;
  }

  ref($pamh = new Authen::PAM($service, $username, \&my_conv_func)) ||
         die "Error code $pamh during PAM init!";

  $res = $pamh->pam_set_item(PAM_TTY(), $tty_name);
  $res = $pamh->pam_authenticate;
  print $pamh->pam_strerror($res),"\n" unless $res == PAM_SUCCESS();


답변

루트 액세스 권한이 있고 md5 비밀번호를 사용 중이고 비밀번호를 비교해야하는 경우 perl Crypt :: PasswdMD5 모듈을 사용할 수 있습니다 . / etc / shadow에서 MD5 해시를 가져와 $ 1 $를 벗기고 나머지 $로 나눕니다. 필드 1 = 소금, 필드 2 = 암호화 된 텍스트. 그런 다음 텍스트 입력을 CGI에 해시하고 암호화 된 텍스트와 비교하고 Bob은 삼촌입니다.

#!/usr/bin/env perl

use Crypt::PasswdMD5;

my $user                = $ARGV[0];
my $plain               = $ARGV[1];
my $check               = qx{ grep $user /etc/shadow | cut -d: -f2 };
chomp($check);
my($salt,$md5txt)       = $check =~ m/\$1\$([^\$].+)\$(.*)$/;
my $pass                = unix_md5_crypt($plain, $salt);

if ( "$check" eq "$pass" ) {
        print "OK","\n";
} else {
        print "ERR","\n";
}


답변

검색 후 스크립트에서 사용할 수있는이 C 프로그램을 작성했습니다.

#include <stdlib.h>
#include <stdio.h>
#include <pwd.h>
#include <shadow.h>
#include <string.h>
#include <crypt.h>
#include <unistd.h>
#include <libgen.h>

int main(int argc, char **argv) {
    struct spwd *pwd;
    if (argc != 3) {
        printf("usage:\n\t%s [username] [password]\n", basename(argv[0]));
        return 1;
    } else if (getuid() == 0) {
        pwd = getspnam(argv[1]);
        return strcmp(crypt(argv[2], pwd->sp_pwdp), pwd->sp_pwdp);
    } else {
        printf("You need to be root\n");
        return 1;
    }
}

다음과 같이 컴파일하십시오.

gcc -Wall password_check.c /usr/lib/libcrypt.a -o check_passwd

당신은 그것을 사용할 수 있습니다

sudo ./check_passwd <user> <password> && echo "success" || echo "failure"


답변

파이썬에서 CGI를 사용한다고 언급 했으므로 Apache를 httpd 서버로 사용한다고 가정하는 것이 적합합니다. 그렇다면 프로그램의 인증 프로세스를 Apache에 맡기고 인증 된 사용자 만 cgi 스크립트 / 프로그램을 실행하도록하십시오.

Apache에서 인증을 수행 할 수있는 충분한 모듈이 있으며, 실제로 원하는 인증 메커니즘의 종류에 따라 다릅니다. 질문에서 인용 한 방법은 / etc / passwd, shadow 파일을 기반으로하는 로컬 호스트 계정 인증과 관련이있는 것 같습니다. 이것에 관한 나의 빠른 검색에 오는 모듈은 mod_auth_shadow입니다. 장점은 권한있는 사용자 (권한 포트 80에서 실행)가 사용자 / 비밀번호를 인증 할 수있게하고 필요한 경우 사용자 대신 인증 된 정보를 사용하여 사용자 대신 명령을 실행할 수 있다는 것입니다.

시작하기에 좋은 링크 :

http://adam.shand.net/archives/2008/apache_tips_and_tricks/#index5h2

http://mod-auth-shadow.sourceforge.net/

http://www.howtoforge.com/apache_mod_auth_shadow_debian_ubuntu

또 다른 방법은 인증 된 사용자 대신 프로세스 (cgi 프로그램)를 실행하는 Apache의 SuEXEc 모듈을 사용하는 것입니다.