সিস্টেম লগইনের জন্য আমি কীভাবে একটি পরীক্ষা লিখব?


9

আমি একটি পাইথন সিজিআই স্ক্রিপ্ট লিখেছি যা bashআদেশগুলি আহ্বান করে, এবং এটি হোস্টে একটি সফল লগইনের জন্য পরীক্ষা করা দরকার।

আমি কীভাবে তার জন্য একটি পরীক্ষা লিখব?

উদাহরণস্বরূপ, আমি কি এমন bashস্ক্রিপ্ট তৈরি করতে পারি যা হোস্টের নিবন্ধিত ব্যবহারকারীর বিপরীতে প্রদত্ত ব্যবহারকারীর নাম এবং পাসওয়ার্ডের সংমিশ্রণটি পরীক্ষা করে?


1
সম্ভবত আপনি loginপ্রোগ্রামটির পিছনে কোডটি দেখতে পারেন ।
কেভিন

প্রশ্নের সাথে সম্পর্কিত নয়, তবে আমি আশা করি আপনি আপনার ওয়েব সার্ভারে ট্র্যাফিক এনক্রিপ্ট করছেন যাতে ব্যবহারকারীর লগইনগুলি তারের মুখ থেকে স্নিগ্ধ করা যায় না।
jw013

উত্তর:


8

পিএএম ব্যবহার করা সবচেয়ে ভাল সমাধান। আপনি ছোট সি কোড লিখতে বা পাইথন-প্যাম প্যাকেজ ইনস্টল করতে পারেন এবং পাইথন স্ক্রিপ্ট ব্যবহার করতে পারেন যা পাইথন-প্যাম প্যাকেজ সহ আসে। দেখা/usr/share/doc/python-pam/examples/pamtest.py


আমি প্যাম চেষ্টা করেছিলাম কিন্তু এটি কার্যকর হয়নি। তবে আমি এই উদাহরণটি আবার চেষ্টা করি এবং এটি কার্যকর হয়।
jcubic

1
ওপেনসুএসই 12.3 (পাইথন-পাম 0.5.0-84.1.1) এবং 13.1 (0.5.0-87.1.2) এ, পামেস্ট.পি-র সম্পূর্ণ পাথ /usr/share/doc/packages/python-pam/examples/pamtest.pyস্ক্রিপ্ট পামেস্ট.পি পিএএম ব্যবহার করে সিস্টেমে শংসাপত্রগুলি পরীক্ষা করতে ব্যবহার করা যেতে পারে প্রমাণীকরণের জন্য, পাইথন-প্যাম প্যাকেজটিতে অন্তর্ভুক্ত করা হয় (যার জন্য পাইথন প্রয়োজন), এবং কিছু বিতরণে পুরো পথটি রয়েছে /usr/share/doc/python-pam/examples/pamtest.py
শ্যাড স্টার্লিং

5

কোনও ব্যবহারকারী লগ ইন করতে পারে কিনা তা পরীক্ষার সঠিক পন্থাটি আসলে সেই ব্যবহারকারী হিসাবে লগ ইন করা।

সুতরাং আমি যা প্রস্তাব দিচ্ছি তা হল সিজিআই স্ক্রিপ্টটি expectচালানোর জন্য ব্যবহার করা su, একটি পাসওয়ার্ড পাস করা এবং যে আদেশটি কার্যকর করা উচিত তা চালানো। এখানে একটি প্রত্যাশিত স্ক্রিপ্টের একটি খসড়া রয়েছে যা কেবল এটি করে (সতর্কতা: একেবারে অপরিশোধিত এবং আমি প্রত্যাশায় সাবলীল নই)। ব্যবহারকারীর নাম, পাসওয়ার্ড এবং কমান্ডে সাবস্টিটিউট (আমি যেখানে লিখেছিলেন bob, swordfishএবং somecommand); সঠিকভাবে উদ্ধৃতি নিশ্চিত করুন।

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

আপনি যদি সত্যিই কোন স্তরের মাধ্যমে কমান্ডটি প্রয়োগ করতে না চান su(উদাহরণস্বরূপ কারণ আপনি যা করেন তা নিজেই সিজিআই প্রক্রিয়া দ্বারা সম্পাদন করতে হবে), তবে কমান্ডটি চালানোর প্রত্যাশা ব্যবহার করুন trueএবং ফিরে আসার স্থিতি 0 আছে কিনা তা পরীক্ষা করুন।

আর একটি পদ্ধতি হ'ল পাইথনের পিএএম বাইন্ডিংয়ের মাধ্যমে আপনার অ্যাপ্লিকেশনটিতে সরাসরি পাম ব্যবহার করা ।


এটি দুর্দান্ত, একমাত্র সমাধান যা মূল অ্যাক্সেস ছাড়াই।
jcubic

su -c true bob && echo successএটি এটি লজ্জার জন্য কাজ করে যে su টি পাসওয়ার্ডটি যুক্তি হিসাবে স্বীকার করবেন না
jcubic

আমি suসিজিআই স্ক্রিপ্ট থেকে পরীক্ষা করেছি এবং এটি কাজ করার জন্য এটির একটি টার্মিনাল প্রয়োজন।
jcubic

3
@ জেকিউবিক একটি কমান্ড লাইন আর্গুমেন্টে একটি পাসওয়ার্ড রাখা সত্যিই বোকামি ধারণা, কারণ ইউনিক্স সিস্টেমে কমান্ড লাইন আর্গুমেন্টগুলি সর্বজনীন। পাসওয়ার্ড অপসারণ করা কমান্ড লাইনে রাখার মতো একই স্তরের সুরক্ষা সরবরাহ করবে। এবং এটি চেক করা আরও সহজ হবে: /bin/trueযথেষ্ট হবে।
সিভ করা

2

আরও সুনির্দিষ্টভাবে উত্তর দেওয়ার জন্য: "হোস্টের নিবন্ধিত ব্যবহারকারীর বিপরীতে প্রদত্ত ব্যবহারকারীর নাম এবং পাসওয়ার্ডের সংমিশ্রণটি পরীক্ষা করে এমন কোনও বাশ স্ক্রিপ্ট তৈরি করা সম্ভব?"

হ্যাঁ.

#!/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

2
এই কাজ কি তোমার জন্য ছিল? আমি দেখতে পাচ্ছি যে আপনি ছায়ার পাসওয়ার্ডের বিপরীতে কোনও বিদ্যমান ছায়া পাসওয়ার্ড চেক করছেন তবে এখানে হ্যাশিং কোথায় জড়িত?
নিখিল মুলি 11'12

আমি পরীক্ষা করেছি এবং এটি কাজ করে না
jcubic

3
খারাপ ধারণা! আপনি ধরে নিচ্ছেন যে আপনার প্রোগ্রামটি মূল হিসাবে চলছে, বা কমপক্ষে shadowগ্রুপ হিসাবে চলছে , যা কোনও সিজিআইয়ের পক্ষে খুব দৃ strongly়ভাবে সুপারিশ করা হয়নি: আপনার সুযোগসুবিধা বৃদ্ধির আরও একটি স্তর প্রয়োজন। এবং আপনি একটি নির্দিষ্ট পাসওয়ার্ড হ্যাশিং অ্যালগরিদম (ওপেনসেল দ্বারা সমর্থিত একটি) এবং পাসওয়ার্ড স্টোরেজ অবস্থান ( /etc/shadowযেমন এনআইএস বা এলডিএপি বিপরীতে) ধরে নিচ্ছেন যা সেই নির্দিষ্ট ব্যবহারকারীর পক্ষে প্রকৃতপক্ষে ব্যবহৃত এক হতে পারে বা নাও হতে পারে।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

2

এখানে একটি 'সি', 'পাইথন' পিএএম সমাধান উদ্ধৃত হয়েছে, আমাকেও পার্লটি রাখি :-)

সূত্র: 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();

হ্যাঁ, ঠিক আছে, তবে প্রশ্নটি পাইথনে লিখিত একটি সিজিআই স্ক্রিপ্ট সম্পর্কে।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

1

যদি আপনার কাছে রুট অ্যাক্সেস থাকে এবং আপনি এমডি 5 পাসওয়ার্ড ব্যবহার করেন এবং আপনার কেবল পাসওয়ার্ডের তুলনা করতে হবে তবে আপনি পার্ল ক্রিপ্ট :: পাসউডিএমডি 5 মডিউলটি ব্যবহার করতে পারেন । MD5 হ্যাশটি / ইত্যাদি / ছায়া থেকে নিন, $ 1 $ কে স্ট্রিপ করুন এবং তারপরে বাকী $ এ ভাগ করুন $ ক্ষেত্র 1 = লবণ, ক্ষেত্র 2 = ক্রিপ্টযুক্ত পাঠ্য। তারপরে আপনার সিজিআইতে পাঠ্য ইনপুটটি হ্যাশ করুন, এটি ক্রিপ্টযুক্ত পাঠ্যের সাথে তুলনা করুন এবং বব আপনার মামা।

#!/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";
}

2
খুব সহজ :-). এটি ততক্ষণ কাজ করবে যতক্ষণ না / ইত্যাদি / পাসডাব্লুডি এমডি 5 হ্যাশিং ব্যবহার করে system সিস্টেমের জন্য প্রমাণীকরণ (এনএসউইচ) আলাদা হয় তবে পাম মডিউলগুলি ব্যবহার করা সবচেয়ে ভাল।
নিখিল মুলি 11'12

2
খারাপ ধারণা! আপনি ধরে নিচ্ছেন যে আপনার প্রোগ্রামটি মূল হিসাবে চলছে, বা কমপক্ষে shadowগ্রুপ হিসাবে চলছে , যা কোনও সিজিআইয়ের পক্ষে খুব দৃ strongly়ভাবে সুপারিশ করা হয়নি: আপনার সুযোগসুবিধা বৃদ্ধির আরও একটি স্তর প্রয়োজন। এবং আপনি একটি নির্দিষ্ট পাসওয়ার্ড হ্যাশিং অ্যালগরিদম (MD5 এবং বিক্রিপ্ট বা অন্যান্য প্রস্তাবিত অ্যালগরিদম নয়) এবং পাসওয়ার্ড স্টোরেজ অবস্থান ( /etc/shadowযেমন এনআইএস বা এলডিএপি এর বিপরীতে) ধরে নিচ্ছেন যা সম্ভবত সেই নির্দিষ্ট ব্যবহারকারীর জন্য ব্যবহৃত এক হতে পারে বা নাও হতে পারে।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

0

কিছু অনুসন্ধানের পরে আমি এই সি প্রোগ্রামটি লিখেছিলাম যা স্ক্রিপ্ট থেকে ব্যবহার করা যেতে পারে

#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"

1
খারাপ ধারণা! আপনি ধরে নিচ্ছেন যে আপনার প্রোগ্রামটি মূল হিসাবে চলছে, বা কমপক্ষে shadowগ্রুপ হিসাবে চলছে , যা কোনও সিজিআইয়ের পক্ষে খুব দৃ strongly়ভাবে সুপারিশ করা হয়নি: আপনার সুযোগসুবিধা বৃদ্ধির আরও একটি স্তর প্রয়োজন। এবং আপনি একটি নির্দিষ্ট পাসওয়ার্ড হ্যাশিং অ্যালগরিদম (ওপেনসেল দ্বারা সমর্থিত একটি) এবং পাসওয়ার্ড স্টোরেজ অবস্থান ( /etc/shadowযেমন এনআইএস বা এলডিএপি বিপরীতে) ধরে নিচ্ছেন যা সেই নির্দিষ্ট ব্যবহারকারীর পক্ষে প্রকৃতপক্ষে ব্যবহৃত এক হতে পারে বা নাও হতে পারে। প্যাম ব্যবহার করুন, এটি তার কাজ জানে।
গিলস 'এস-অশুভ হওয়া বন্ধ করুন'

হ্যাঁ আমি জানি, কিন্তু ভেবেছিলাম যে এটি বিনা মূল ছাড়াই কার্যকর। অন্যান্য সমস্ত সমাধানগুলিও রুট ব্যবহার করে, আপনার ব্যবহার করবে।
jcubic

0

যেহেতু আপনি উল্লেখ করেছেন যে আপনি পাইথনে সিজিআই ব্যবহার করছেন, এটি ধরে নেওয়া সম্ভবত উপযুক্ত যে আপনি অ্যাপাচি আপনার httpd সার্ভার হিসাবে ব্যবহার করছেন। যদি তা হয় তবে আপনার প্রোগ্রামের প্রমাণীকরণ প্রক্রিয়াটিকে অ্যাপাচে ছেড়ে দিন এবং কেবলমাত্র অনুমোদিত ব্যক্তিরা আপনার সিজি স্ক্রিপ্ট / প্রোগ্রামগুলি সম্পাদন করতে দিন।

অ্যাপাচি-তে আপনার জন্য প্রমাণীকরণ করতে পারে এমন পর্যাপ্ত মডিউল রয়েছে, এটি আপনি কী ধরণের প্রমাণীকরণ প্রক্রিয়াটি অনুসন্ধান করছেন তার উপর নির্ভর করে। আপনি প্রশ্নটিতে যেভাবে উদ্ধৃতি দিয়েছেন তা মনে হয় স্থানীয় হোস্ট অ্যাকাউন্ট প্রমাণীকরণের সাথে সম্পর্কিত / ইত্যাদি / পাসডাব্লুড, ছায়া ফাইল। এটি সম্পর্কে আমার দ্রুত অনুসন্ধানে আসে মডিউলটি mod_auth_shadow। সুবিধা হ'ল আপনি অনুমোদনপ্রাপ্ত কাউকে (সুবিধাপ্রাপ্তি বন্দরে ৮০ তে চলমান) আপনার জন্য ব্যবহারকারী / পাসওয়ার্ড প্রমাণীকরণের অনুমতি দিচ্ছেন এবং প্রয়োজনে আপনি ব্যবহারকারীর পক্ষে আদেশগুলি চালানোর জন্য ব্যবহারকারীর সত্যায়িত তথ্যের উপর নির্ভর করতে পারেন।

শুরু করার জন্য ভাল লিঙ্কগুলি:

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

আরেকটি পদ্ধতি হ'ল অ্যাপাচি-র সুেক্সেক্স মডিউল ব্যবহার করা, যা প্রমাণীকরণকারীর পক্ষে প্রসেস (সিজি প্রোগ্রাম) চালায়।


এই সিজিআই স্ক্রিপ্টটি জেএসএন-আরপিসি পরিষেবাটি অ্যাজাক্সের মাধ্যমে কল করা হয় এবং আমার পদ্ধতি লগইন দরকার যা একটি টোকেন ফিরিয়ে দেয়, লগইন সফল হলে টোকেন ফিরিয়ে দেওয়া উচিত। সুতরাং মৌলিকভাবে প্রতিটি ব্যবহারকারীর সেই স্ক্রিপ্টটি কার্যকর করতে সক্ষম হওয়া দরকার।
jcubic

0

পিএএম ব্যবহার করে এই কোডটি আমার পক্ষে কাজ করেছিল:

#include <security/pam_appl.h>
#include <security/pam_misc.h>
#include <stdio.h>
#include <string.h>

// Define custom PAM conversation function
int custom_converation(int num_msg, const struct pam_message** msg, struct pam_response** resp, void* appdata_ptr)
{
    // Provide password for the PAM conversation response that was passed into appdata_ptr
    struct pam_response* reply = (struct pam_response* )malloc(sizeof(struct pam_response));
    reply[0].resp = (char*)appdata_ptr;
    reply[0].resp_retcode = 0;

    *resp = reply;

    return PAM_SUCCESS;
}

int main (int argc, char* argv[]) 
{
    if (argc > 2)
    {
        // Set up a custom PAM conversation passing in authentication password
        char* password = (char*)malloc(strlen(argv[2]) + 1);
        strcpy(password, argv[2]);        
        struct pam_conv pamc = { custom_converation, password };
        pam_handle_t* pamh; 
        int retval;

        // Start PAM - just associate with something simple like the "whoami" command
        if ((retval = pam_start("whoami", argv[1], &pamc, &pamh)) == PAM_SUCCESS)
        {
            // Authenticate the user
            if ((retval = pam_authenticate(pamh, 0)) == PAM_SUCCESS) 
                fprintf(stdout, "OK\n"); 
            else 
                fprintf(stderr, "FAIL: pam_authentication failed.\n"); 

            // All done
            pam_end(pamh, 0); 
            return retval; 
        }
        else
        {
            fprintf(stderr, "FAIL: pam_start failed.\n"); 
            return retval;
        }
    }

    fprintf(stderr, "FAIL: expected two arguments for user name and password.\n"); 
    return 1; 
}

আপনি আরও উত্তরের মতো "অনুভূতি" তৈরি করতে কিছু প্রসঙ্গ তথ্য যুক্ত করতে পারেন?
ভোলকার সিগেল

-3

হোস্টে লগইন করার জন্য আপনার যদি কোনও স্ক্রিপ্টের প্রয়োজন হয় তবে আপনি যা করতে পারেন তা হ'ল হোস্টগুলির মধ্যে একটি এসএসএইচ কী কনফিগার করা।

লিঙ্ক: http://pkeck.myweb.uga.edu/ssh/

আমি পৃষ্ঠা থেকে খুব উত্তোলন করেছি


প্রথমে তাত্ক্ষণিকভাবে এবং দুরন্তভাবে দুটি ইউনিক্স মেশিনে ওপেনএসএসএইচ ইনস্টল করুন। আমি যতদূর বলতে পারি ডিফল্টরূপে ডিএসএ কী এবং এসএসএইচ 2 ব্যবহার করে এটি সবচেয়ে ভাল কাজ করে। অন্য যে সমস্ত হাওটো আমি দেখেছি সেগুলি আরএসএ কী এবং এসএসএইচ 1 নিয়ে কাজ করবে বলে মনে হয় এবং নির্দেশাবলী আশ্চর্যজনকভাবে এসএসএইচ 2 নিয়ে কাজ করতে ব্যর্থ হয়। প্রতিটি মেশিনে ssh somemachine.example.com টাইপ করুন এবং আপনার নিয়মিত পাসওয়ার্ডের সাথে সংযোগ করুন। এটি যথাযথ পার্ম সহ আপনার হোম ডিরেক্টরিতে একটি .ssh দির তৈরি করবে। আপনার প্রাথমিক মেশিনে যেখানে আপনি নিজের গোপন কীগুলি বাস করতে চান (তাড়াতাড়ি বলা যাক) টাইপ করুন

ssh-keygen -t dsa

এটি আপনাকে একটি গোপন পাসফ্রেজের জন্য অনুরোধ করবে। এটি যদি আপনার প্রাথমিক পরিচয় কী হয় তবে একটি ভাল পাসফ্রেজ ব্যবহার করতে ভুলবেন না। যদি এটি ঠিকভাবে কাজ করে তবে আপনি আপনার .ssh dir এ id_dsa এবং id_dsa.pub নামে দুটি ফাইল পাবেন। দ্রষ্টব্য: একটি পাসফ্রেজের জন্য অনুরোধ করা হলে কেবল এন্টার কী টিপানো সম্ভব, যা কোনও পাসফ্রেজ ছাড়াই একটি কী তৈরি করবে। এটি একটি পরিচয় কীটির জন্য একটি খারাপ ধারণা it তাই এটি করবেন না! পাসফ্রেসবিহীন কীগুলির ব্যবহারের জন্য নীচে দেখুন।

scp ~/.ssh/id_dsa.pub burly:.ssh/authorized_keys2

Id_dsa.pub ফাইলটি অনন্য হোস্টের .ssh dir অনুলিপি_প্রেমী 2 নামে অনুলিপি করুন। এখন বুড়ো আপনার ssh কী গ্রহণ করতে প্রস্তুত। এটি কী কী ব্যবহার করবেন তা বলবেন? Ssh-add কমান্ড এটি করবে। একটি পরীক্ষার জন্য, টাইপ করুন

ssh-agent sh -c 'ssh-add < /dev/null && bash'

এটি ssh- এজেন্টটি শুরু করবে, আপনার ডিফল্ট পরিচয় যুক্ত করবে (আপনাকে আপনার পাসফ্রেজের জন্য অনুরোধ করবে) এবং ব্যাশ শেলটি স্প্যান করবে। এই নতুন শেল থেকে আপনার সক্ষম হওয়া উচিত:

ssh burly

আপনি লগ ইন করতে সক্ষম হওয়া উচিত


এটি সত্য হলেও এটি কোনও প্রশ্নের সাথে প্রাসঙ্গিক বলে মনে হয় না, যা কোনও ওয়েব ব্রাউজারের মাধ্যমে অ্যাক্সেস করা অ্যাপ্লিকেশন সম্পর্কে।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.