wiki:articles:pam - Wiki на Slackware.su
Вход в систему пользователем домена (или PAM в Slackware)


Или, другими словами, аутентификация и дальнейшая авторизация в системе Slackware 14.0 с использованием логина и пароля взятого с Activ Directory (AD).

В виду того, что зона .local зарезервирована mDNS, настоятельно не рекомендуется использовать её в рабочем варианте.
Ниже приведённые названия даны, исключительно, только в качестве примеров.

Начало

Для того, чтобы осуществить задуманное, нам необходимо:

  • Собрать и установить PAM;
  • Собрать и установить samba с поддержкой PAM;
  • Собрать и установить shadow с поддержкой PAM;
  • Всё это дело настроить.
Файл Описание
pam-1.1.3-i486-1.txz Собранный пакет PAM
shadow-4.1.5.1-i586-pam-1.tgz Собранный пакет shadow с поддержкой PAM
samba-3.6.12-i486-1_slack14.0.txz Собранный пакет samba с поддержкой PAM
samba_pam_slackbuild.tar.gz SlackBuild для сборки samba с поддержкой PAM
pam.d.tar.gz Каталог pam.d со всеми рабочими настройками
confs_pam.tar.gz Файлы конфигураций (krb5.conf, login.defs, nsswitch.conf, pam.conf, resolv.conf, smb.conf)

Как собрать и где применить - ниже по статье.

Работать будем с контролером домена из ЭТОЙ СТАТЬИ.
Т.е.:

Домен TRANSIT
Контролер домена DC1.TRANSIT.LOCAL
IP контролера домена 192.168.10.188
IP шлюза и сервера времени 192.168.10.250
Тестовый компьютер со Slackware 14.0 Slack-test
IP тестового компьютер со Slackware 14.0 192.168.10.44
Администратор домена Administrator
Пользователь домена v_pupkin

В принципе, оно работает и с контролером домена на Windows 2003 (проверено).

Прежде чем начнёте, повторю высказывание Патрика по поводу PAMа:

«I think a better name for PAM might be SCAM, for Swiss Cheese Authentication Modules, and have never felt that the small amount of convenience it provides is worth the great loss of system security. We miss out on half a dozen security problems a year by not using PAM, but you can always install it yourself if you feel that you're missing out on the fun. (No, don't do that)»
Patrick.


Что на великом и могучем звучит, примерно, так:

«Я думаю, что лучшим названием для PAM может быть SCAM (Swiss Cheese Authentication Modules - Швейцарско сырный модуль аутентификации) и никогда не чувствовал, что небольшое количество удобств, которое он обеспечивает, стоит большой потери безопасности системы . Мы освободились от полдюжины проблем безопасности в год, не используя PAM, но вы всегда можете установить его самостоятельно, если чувствуете, что упускаете самое интересное. (Нет, не делайте этого)»
Патрик.

Собираем PAM

Начиная с версии 13.37, в дистрибутиве Slackware Linux в папке extra/source/pam, присутствует SlackBuild, который поможет нам собрать и в итоге получить готовый пакет pam-1.1.3-i486-1.txz.
Установим его:

# installpkg pam-1.1.3-i486-1.txz

далее собираем остальные пакеты. Соберем samba.

Собираем и настраиваем samba

Прежде чем начать собирать samba, нам необходимо собрать и установить керберос. Я тестировал с MIT Kerberos.
При помощи sbopkg правим слакбилд, info, собираем и устанавливаем последнюю версию MIT kerberos.

Для того, чтобы не искать программы от kerberos добавим их в /etc/profile:

.....
.....
# Set the default system $PATH:
PATH="/usr/local/bin:/usr/bin:/bin:/usr/games:/usr/kerberos/bin:/usr/kerberos/sbin"
.....
.....

Далее, для примера возьмем samba-3.6.12.
Скачаем SlackBuild samba_pam_slackbuild.tar.gz уже подправленный для сборки с PAM или с http://mirror.yandex.ru/slackware/slackware-14.0/source/n/samba/, где нужно будет подправить SlackBuild в части ./configure.
Скачаем саму самбу samba-3.6.12.tar.gz и положим файл в каталог со SlackBuild'ом.
Если используете уже подправленный SlackBuid, то просто запустите его, если нет, то в части ./configure измените на нижеследующее:

./configure \
  --prefix=/usr \
  --libdir=/usr/lib${LIBDIRSUFFIX} \
  --bindir=/usr/bin \
  --sbindir=/usr/sbin \
  --mandir=/usr/man \
  --sysconfdir=/etc \
  --with-configdir=/etc/samba \
  --with-piddir=/var/run \
  --with-privatedir=/etc/samba/private \
  --localstatedir=/var \
  --with-lockdir=/var/cache/samba \
  --with-logfilebase=/var/log/samba \
  --with-acl-support \
  --with-automount \
  --with-quotas \
  --with-syslog \
  --with-utmp \
  --with-winbind \
  --with-ldap \
  --with-ads \
  --with-sendfile-support \
  --with-dnsupdate \
  --with-profiling-data \
  --with-fhs \
  --with-swatdir=/usr/share/swat \
  --with-pammodulesdir=/etc/security \
  --with-krb5=/usr/kerberos \
  --with-pam \
  --with-pam_smbpass \
  --enable-cups \
  --enable-external-libtalloc=no \
  --enable-static=no \
  --enable-shared=yes \
  --with-cifsmount \
  --with-cifsumount \
  --with-quotas \
  --with-libsmbclient \
  --build=$ARCH-slackware-linux

Для чистоты эксперимента я удалил установленную самбу и поставил вновь собранную.

После установки скопируем 2 библиотеки pam_smbpass.so и pam_winbind.so туда, где им положено быть.

# cp /etc/security/*.so /lib/security/ 

Теперь необходимо её настроить для ввода в домен. Для этого правим нужные файлы.
В начале статьи есть файл confs_pam.tar.gz в котором уже собраны файлы с рабочими у меня настройками, но на всякий случай, я их дублирую прямо в статье. И так, по порядку:

/etc/krb5.conf

[logging]
 default = FILE10000:/var/log/krb5/krb5lib.log
# default = FILE:/var/log/krb5/krb5libs.log
 kdc = FILE:/var/log/krb5/krb5kdc.log
 admin_server = FILE:/var/log/krb5/kadmind.log

[libdefaults]
  default_realm = TRANSIT.LOCAL
  dns_lookup_realm = true
  dns_lookup_kdc = true
  ticket_lifetime = 24h
  forwardable = yes

[realms]
    TRANSIT.LOCAL = {
         kdc = dc1.transit.local:88
         admin_server = dc1.transit.local:750
         default_domain = transit.local
     }

[domain_realm]
 .transit.local = TRANSIT.LOCAL
  transit.local = TRANSIT.LOCAL

[appdefaults]
    pam = {
        debug = false
        ticket_lifetime = 36000
        renew_lifetime = 36000
        forwardable = true
        krb4_convert = false
    }

/etc/resolv.conf

search transit.local
nameserver 192.168.10.188

/etc/nsswitch.conf

# passwd:       files nis
# shadow:       files nis
# group:        files nis

passwd:         files winbind
shadow:         files winbind
group:          files winbind

hosts:          files dns
networks:       files

services:       files
protocols:      files
rpc:            files
ethers:         files
netmasks:       files
netgroup:       files
bootparams:     files

automount:      files
aliases:        files

/etc/smb.conf

[global]
interfaces = eth0 lo
hosts allow = 192.168.10. 127.
netbios name = Slack-test
server string = Slack_test
security = ADS
workgroup = TRANSIT
realm = TRANSIT.LOCAL
obey pam restrictions = yes
allow trusted domains = No
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
name resolve order = hosts wins bcast lmhosts
case sensitive = no
dns proxy = no
client use spnego = yes
client signing = yes
os level = 0
preferred master = No
local master = No
domain master = No
dns proxy = No
ldap ssl = no
strict locking = No
time server = no
auth methods = winbind
encrypt passwords = yes

winbind enum users = Yes
winbind enum groups = Yes
winbind use default domain = yes
winbind refresh tickets = yes
winbind uid = 10000-20000
winbind gid = 10000-20000

template shell = /bin/bash
template homedir = /home/%D/%U

log file = /var/log/samba/log.%m
max log size = 1024
log level = 3
display charset = koi8-r
unix charset = koi8-r
dos charset = cp866
nt acl support = yes

printcap name = /etc/printcap

Пробуем получить билетик:

# kinit Administrator
Password for Administrator@TRANSIT.LOCAL: 

# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: Administrator@TRANSIT.LOCAL

Valid starting       Expires              Service principal
11.03.2013 17:59:03  12.03.2013 03:59:03  krbtgt/TRANSIT.LOCAL@TRANSIT.LOCAL
        renew until 12.03.2013 18:01:50

Получили, теперь введем машину в домен:

# net ads join -U  Administrator
Enter Administrator's password:
Using short domain name -- TRANSIT
Joined 'SLACK-TEST' to dns domain 'transit.local'

Немного изменим файл /etc/rc.d/rc.samba добавив winbindd. В итоге он будет выглядеть так:

#
# /etc/rc.d/rc.samba
#
# Start/stop/restart the Samba SMB file/print server.
#
# To make Samba start automatically at boot, make this
# file executable:  chmod 755 /etc/rc.d/rc.samba
#

samba_start() {
  if [ -x /usr/sbin/smbd -a -x /usr/sbin/nmbd -a -r /etc/samba/smb.conf ]; then
    echo "Starting Samba:  /usr/sbin/smbd -D"
    /usr/sbin/smbd -D
    echo "                 /usr/sbin/nmbd -D"
    /usr/sbin/nmbd -D
    echo "                 /usr/sbin/winbindd -D"
    /usr/sbin/winbindd -D
  fi
}

samba_stop() {
  killall smbd nmbd winbindd
}

samba_restart() {
  samba_stop
  sleep 2
  samba_start
}

case "$1" in
'start')
  samba_start
  ;;
'stop')
  samba_stop
  ;;
'restart')
  samba_restart
  ;;
*)
  # Default is "start", for backwards compatibility with previous
  # Slackware versions.  This may change to a 'usage' error someday.
  samba_start
esac

дадим ему права на запуск и запустим samba:

# chmod 755 /etc/rc.d/rc.samba
# /etc/rc.d/rc.samba start
Starting Samba:  /usr/sbin/smbd -D
                 /usr/sbin/nmbd -D
                 /usr/sbin/winbindd -D
 

Проверим связь с контролером домена:

# wbinfo -t
checking the trust secret for domain TRANSIT via RPC calls succeeded

# wbinfo -u
v_pupkin
administrator
dns-dc1
krbtgt
guest

# wbinfo -g
.....
.....
domain admins
domain guests
schema admins
domain users
dnsadmins

# wbinfo -a administrator
Enter administrator's password:
plaintext password authentication succeeded
Enter administrator's password:
challenge/response password authentication succeeded

А теперь нужно убедиться, что программа getent покажет нам локальных и доменных пользователей и группы одновременно:

# getent passwd
root:x:0:0::/root:/bin/bash
.....
.....
apache:x:80:80:User for Apache:/srv/httpd:/bin/false
messagebus:x:81:81:User for D-BUS:/var/run/dbus:/bin/false
haldaemon:x:82:82:User for HAL:/var/run/hald:/bin/false
pop:x:90:90:POP:/:/bin/false
nobody:x:99:99:nobody:/:/bin/false
v_pupkin:*:10000:10000:Пупкин Василий Иванович:/home/TRANSIT/v_pupkin:/bin/bash
administrator:*:10001:10000:Administrator:/home/TRANSIT/administrator:/bin/bash
dns-dc1:*:10002:10000:dns-dc1:/home/TRANSIT/dns-dc1:/bin/bash
krbtgt:*:10003:10000:krbtgt:/home/TRANSIT/krbtgt:/bin/bash
guest:*:10004:10001:Guest:/home/TRANSIT/guest:/bin/bash

# getent group
root:x:0:root
bin:x:1:root,bin
daemon:x:2:root,bin,daemon
.....
.....
domain admins:x:10013:administrator
domain guests:x:10001:
schema admins:x:10014:administrator
domain users:x:10000:
dnsadmins:x:10015:

Отлично! Всё необходимое мы проверили - работает! Теперь приступим к самому серьёзному - к установке shadow.

Собираем и устанавливаем shadow

После установки НЕ ПЕРЕЗАГРУЖАЙТЕСЬ !!! Дочитайте статью до конца, чтобы знать где искать ошибки. Перейдите в соседнюю консоль (Alt+F2(3,4,5,6) или из Х-ов Ctrl+Alt+F2(3,4,5,6)). 100500 раз проверьте, что у вас всё работает и работает так, как Вам необходимо! А именно команды login, logout, su, useradd, usermod, ssh и им подобные (подробный список программ которые будут заменены можно посмотреть непосредственно в пакете).

Скачаем последнюю версию, на сегодня, shadow, соберем с поддержкой РАМ и установим в систему.

# wget http://pkg-shadow.alioth.debian.org/releases/shadow-4.1.5.tar.gz
# tar xf shadow-4.1.5.tar.gz
# cd shadow-4.1.5.1
# ./configure \
--prefix=/usr \
--sysconfdir=/etc \
--mandir=/usr/man \
--docdir=/usr/doc/shadow-4.1.5.1 \
--disable-shared \
--without-libcrack \
--with-libpam
# make 
# make install DESTDIR=/tmp/shadow-4.1.5.1
# cd /tmp/shadow-4.1.5.1
# makepkg  -l y -c n /tmp/shadow-4.1.5.1-i586-pam-1.tgz
# upgradepkg --reinstall --install-new /tmp/shadow-4.1.5.1-i586-pam-1

Всё, shadow установлен, теперь нужно настроить PAM и в соседней консоли проверить работоспособность.

Настройка и проверка работоспособности

Настройки PAM находятся в каталоге /etc/pam.d. Изначально его нет, нужно создать. В этом каталоге находятся текстовые файлы с политиками. И именуются эти файлы, соответственно сервису, к которому политики применяются.
Т.е. для программы login, это login и т.д.
Вначале статьи есть архив каталога pam.d с моими рабочими файлами, можете взять их для примера и настроить под себя, или просто создать свои.

Существует возможность настройки РАМ через /etc/pam.conf в котором содержатся все политики PAM для системы. Но я этот метод не испытывал и положил его в архив confs_pam.tar.gz на всякий случай, может кому-то такой способ покажется более привлекательным и он напишет, потом, про это статью. :)
Все политики в файле pam.conf взяты ОТ СЮДА.

Подробно про то, что такое PAM, тонкости настройки и с чем его едят можно почитать:
МНОГО ТУТ.
НЕМНОГО ТУТ.
ЧУТЬ-ЧУТЬ ТУТ.

А мы приступим к настройке.
Если Вы воспользовались каталогом из моего архива pam.d.tar.gz, то Вам, в принципе, здесь настраивать ничего не надо. Разве только убрать или добавить что-то лично под себя.
Я приведу содержимое нескольких файлов, необходимых для входа в систему:

/etc/pam.d/login

#%PAM-1.0
auth required pam_securetty.so
auth sufficient pam_winbind.so
auth sufficient pam_unix.so use_first_pass
auth include system-auth-winbind
auth required pam_nologin.so

account sufficient pam_winbind.so
account include system-auth-winbind

password include system-auth-winbind

session include  system-auth-winbind
session required pam_unix.so
session required pam_env.so
session required pam_motd.so
session required pam_limits.so
session optional pam_mail.so dir=/var/spool/mail standard
session optional pam_lastlog.so
session optional pam_loginuid.so
session optional pam_console.so

/etc/pam.d/passwd

#%PAM-1.0
auth            include         system-auth-winbind
account         include         system-auth-winbind
password        include         system-auth-winbind

/etc/pam.d/su

#%PAM-1.0
auth            sufficient      pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth           sufficient      pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
auth            required        pam_wheel.so use_uid
auth            include         system-auth-winbind
account         include         system-auth-winbind
password        include         system-auth-winbind
session         include         system-auth-winbind
session         optional        pam_xauth.so

/etc/pam.d/usermod

#%PAM-1.0
auth            sufficient      pam_rootok.so
account         required        pam_permit.so
password        include         system-auth

/etc/pam.d/system-auth-winbind

#%PAM-1.0

auth        required      pam_env.so
auth        sufficient    pam_winbind.so
auth        sufficient    pam_unix.so likeauth nullok use_first_pass
auth        required      pam_deny.so

account     sufficient    pam_winbind.so
account     required      pam_unix.so

password    sufficient    pam_unix.so nullok use_authtok md5 shadow
password    required      pam_deny.so

session     required      pam_mkhomedir.so skel=/etc/skel/ umask=0022
session     required      pam_limits.so
session     required      pam_unix.so

/etc/pam.d/system-auth

#%PAM-1.0
auth    required        /lib/security/pam_mount.so
auth    optional        /lib/security/pam_group.so
auth    sufficient      /lib/security/pam_unix.so nullok_secure  use_first_pass
auth    sufficient      /lib/security/pam_winbind.so use_first_pass krb5_auth krb5_ccache_type=FILE debug
auth    required        /lib/security/pam_deny.so

НЕ ПЕРЕЗАГРУЖАТЬСЯ!!!

Переходим в соседнюю консоль и пытаемся зайти под доменным пользователем:

Welcome to Linux 3.2.29-smp (tty3)


Slack-test Login: administrator
ошибка настройки: неизвестный элемент «FAILLOG_ENAB» (сообщите администратору)
ошибка настройки: неизвестный элемент «LASTLOG_ENAB» (сообщите администратору)
ошибка настройки: неизвестный элемент «MAIL_CHECK_ENAB» (сообщите администратору)
Password: 
Your password will expire in 10 days.

Linux 3.2.29-smp.

In a great romance, each person basically plays a part that the
other really likes.
                -- Elizabeth Ashley

administrator@Slack-test:~$                                      

Ура, вошли, но получили ошибки. Ничего страшного, просто нужно закомментировать эти элементы в файле /etc/login.defs.
В файле login.defs идущим в архиве вначале статьи, уже все ошибки закомментированы.
Идём дальше. Пробуем получить привилегии локального root'a

administrator@Slack-test:~$ su -
Password: 
su: Доступ запрещен

Всё верно, ведь пользователь administrator не входит в группу wheel. Вернёмся в родную консоль, убедимся в этом и добавим в группу.

# id administrator
uid=10001(administrator) gid=10000(domain users) группы=10000(domain users),10006(group policy creator owners),10004(denied rodc password replication group),10009(enterprise admins),10014(schema admins),10013(domain admins)

# usermod -a -G wheel administrator

# id administrator
uid=10001(administrator) gid=10000(domain users) группы=10000(domain users),10(wheel),10006(group policy creator owners),10004(denied rodc password replication group),10009(enterprise admins),10014(schema admins),10013(domain admins)

Переходим обратно в соседнюю консоль и проверяем:

administrator@Slack-test:~$ su -
Password: 
F:      When into a room I plunge, I
        Sometimes find some VIOLET FUNGI.
        Then I linger, darkly brooding
        On the poison they're exuding.
                -- The Roguelet's ABC

root@Slack-test:~# 

Всё работает!
Пробуем войти под обычным пользователем домена v_pupkin.

administrator@Slack-test:~$ logout

Welcome to Linux 3.2.29-smp (tty3)


Slack-test Login: v_pupkin
Password: 

Создание каталога /home/TRANSIT/v_pupkin.
Linux 3.2.29-smp.

XIIdigitation, n.:
        The practice of trying to determine the year a movie was made
by deciphering the Roman numerals at the end of the credits.
                -- Rich Hall, "Sniglets"

v_pupkin@Slack-test:~$

И так, вход в систему пользователями домена работает. Но не забывайте, что они не являются членами локальных групп, таких как audio, video, cdrom и т.д. и поэтому не смогут пользоваться всеми «вкусностями» системы. Просто добавьте их в эти группы и наслаждайтесь! :)


- Обсуждаем на форуме -

Печать/экспорт
QR Code
QR Code wiki:articles:pam (generated for current page)