PHP: аутентификация локального пользователя Unix (без прямого доступа к / etc / shadow) - PullRequest
4 голосов
/ 24 июля 2010

Учитывая имя пользователя и пароль, мне нужно проверить, есть ли в локальной системе пользователь с указанными именем пользователя и паролем.

Я знаю posix_getpwnam и использую пакет PAM, нооба эти метода требуют, чтобы скрипт PHP имел доступ к /etc/shadow.Я бы предпочел не связываться с разрешениями системных файлов или пользователей-демонов.

Я полагаю, что это можно сделать либо путаясь со стандартными системными командами, такими как sudo, либо написав собственную небольшую программу на setuid C,Я также мог бы попытаться подключиться к localhost через FTP или SSH с указанным именем пользователя / паролем, чтобы проверить его.Есть ли более простой способ?

Ответы [ 3 ]

1 голос
/ 01 августа 2010

Если вы хотели более естественный способ, вы можете либо бросить свой собственный. Я бы посмотрел больше в PAM : pam_authenticate .

Я имею в виду, вы ДОЛЖНЫ иметь возможность создавать приложение, которое аутентифицирует, но не требует рута, используя PAM, например, sudo.

Но, если вам нужно более простое решение, вы можете просто позвонить:

Источник login.sh

#!/bin/bash
su $1 < `echo $2` #Need echo for the newline

В коде PHP в виде оператора exec для login.sh, где первый параметр - имя пользователя, а второй - пароль.

0 голосов
/ 31 июля 2010

Я также мог бы попытаться подключиться к localhost через FTP или SSH с указанным именем пользователя / паролем, чтобы проверить его.

Это то, что я сделал в конце (используя расширение PHP ssh2).Локальные команды также запускаются через то же соединение под учетными данными пользователя.

0 голосов
/ 25 июля 2010
  1. Я полагаю, что ftp / ssh - отличный способ сделать это, предполагая, что система всегда их запускает.

  2. Еще одна возможность для получения разрешений - написать некоторый скрипт, который будет извлекать этих пользователей из / etc / shadow, и запускать этот скрипт как задание cron для его регулярного обновления. Этот сценарий создает файл с разрешениями, специфичными только для пользователя, работающего с вашей сетью (apache, а что нет), и может проверить с помощью этого файла или даже базы данных записи в mysql, если вы действительно хотите сойти с ума.

Первый простой и легкий в выполнении, второй - немного больше работы. Другой способ, который только что пришел в голову, - это через php выполнить системную команду, такую ​​как useradd $ user, и проверить return. Это требует sudo, хотя.

...