аутентификация PAM в Python без прав root - PullRequest
5 голосов
/ 13 марта 2011

Я ищу способ, позволяющий моей программе на Python обрабатывать аутентификацию через pam. Я использую http://code.google.com/p/web2py/source/browse/gluon/contrib/pam.py для этого, что прекрасно работает, если моя программа на Python запускается от имени пользователя root, что, на мой взгляд, не идеально.

Как я могу использовать pam для проверки имени пользователя / пароля, не требуя привилегий root?

Ответы [ 5 ]

8 голосов
/ 06 сентября 2015

Вам не нужно быть пользователем root, вам нужно только уметь читать /etc/shadow. Этот файл обычно имеет группу shadow с доступом только для чтения. Поэтому вам просто нужно добавить пользователя, который запускает проверку PAM, в группу shadow .

groupadd <user> shadow должен добиться цели.

5 голосов
/ 13 марта 2011

В конце концов я использовал pexpect и попытался ввести su - username.Это немного медленно, но работает довольно хорошо.Приведенный ниже пример не отточен, но вы поймете идею.

Приветствия,

Jay

#!/usr/bin/python
import pexpect
def pam(username, password):
        '''Accepts username and password and tried to use PAM for authentication'''
        try:
                child = pexpect.spawn('/bin/su - %s'%(username))
                child.expect('Password:')
                child.sendline(password)
                result=child.expect(['su: Authentication failure',username])
                child.close()
        except Exception as err:
                child.close()
                print ("Error authenticating. Reason: "%(err))
                return False
        if result == 0:
                print ("Authentication failed for user %s."%(username))
                return False
        else:
                print ("Authentication succeeded for user %s."%(username))
                return True

if __name__ == '__main__':
        print pam(username='default',password='chandgeme')
5 голосов
/ 13 марта 2011

Я думаю, что модуль pam - ваш лучший выбор, но вам не нужно встраивать его непосредственно в вашу программу.Вы можете написать простой сервис, который привязывается к порту на локальном хосте или прослушивает сокет домена UNIX и выполняет запросы PAM для других процессов на том же хосте.Затем подключите к нему ваше приложение web2py для проверки имени пользователя / пароля.

Например:

import asyncore
import pam
import socket

class Client(asyncore.dispatcher_with_send):

    def __init__(self, sock):
        asyncore.dispatcher_with_send.__init__(self, sock)
        self._buf = ''

    def handle_read(self):
        data = self._buf + self.recv(1024)
        if not data:
            self.close()
            return
        reqs, data = data.rsplit('\r\n', 1)
        self._buf = data
        for req in reqs.split('\r\n'):
            try:
                user, passwd = req.split()
            except:
                self.send('bad\r\n')
            else:
                if pam.authenticate(user, passwd):
                    self.send('ok\r\n')
                else:
                    self.send('fail\r\n')

    def handle_close(self):
        self.close()


class Service(asyncore.dispatcher_with_send):

    def __init__(self, addr):
        asyncore.dispatcher_with_send.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.set_reuse_addr()
        self.bind(addr)
        self.listen(1)

    def handle_accept(self):
        conn, _ = self.accept()
        Client(conn)

def main():
    addr = ('localhost', 8317)
    Service(addr)
    try:
        asyncore.loop()
    except KeyboardInterrupt:
        pass

if __name__ == '__main__':
    main()

Использование:

% telnet localhost 8317
bob abc123
ok
larry badpass
fail
incomplete
bad
2 голосов
/ 13 марта 2011

Нет, если вы используете обычные системные (в стиле Unix) учетные данные для входа.В какой-то момент библиотека PAM должна прочитать теневой файл, который доступен для чтения только пользователю root.Однако, если вы используете профиль PAM, который аутентифицируется с помощью альтернативного метода, такого как LDAP или база данных, он может работать без корня.

Это одна из причин, по которой я разработал собственную платформу, которая запускает разные части пространства URL-адресов под разными учетными данными пользователя.Часть входа (только) может запускаться от имени пользователя root для проверки подлинности с помощью PAM (системы), другие обработчики поддерева пути запускаются от имени других пользователей.

Для этого я использую модуль PyPAM .

1 голос
/ 28 ноября 2016

Может быть python-pam может работать на вас.

...