Nntc cloud: различия между версиями

Материал из wiki.nntc.nnov.ru
Перейти к навигации Перейти к поиску
м
 
(не показано 9 промежуточных версий этого же участника)
Строка 1: Строка 1:
PAM секция
+
 
 +
== PAM ==
 +
 
 
Для связи owncloud и pam нужно сделать следующее:
 
Для связи owncloud и pam нужно сделать следующее:
 
* Настроить pam правило, делается это в конфиге '''/etc/pam.d/samba''':
 
* Настроить pam правило, делается это в конфиге '''/etc/pam.d/samba''':
Строка 14: Строка 16:
 
</pre>
 
</pre>
 
* Создать '''/lib/security/pam_dbauth.py''' со следующим содержимым:
 
* Создать '''/lib/security/pam_dbauth.py''' со следующим содержимым:
import syslog
+
<pre>
import hashlib
+
# -*- coding: utf-8 -*-
import base64
+
import syslog
import string
+
import hashlib
import sys
+
import base64
from passlib.hash import bcrypt
+
import string
import ConfigParser
+
import sys
# Можно использовать для отладки, ура!
+
from passlib.hash import bcrypt
# syslog.syslog ("script: Called.")  
+
import ConfigParser
config = ConfigParser.ConfigParser()
+
# Можно использовать для отладки, ура!
config.read('/etc/security/pam_dbauth.conf')
+
# syslog.syslog ("script: Called.")  
dbengine=config.get('database','engine')
+
config = ConfigParser.ConfigParser()
import MySQLdb
+
config.read('/etc/security/pam_dbauth.conf')
dbengineClass=MySQLdb
+
dbengine=config.get('database','engine')
def pam_sm_authenticate(pamh, flags, argv):
+
import MySQLdb
  resp=pamh.conversation(
+
dbengineClass=MySQLdb
    pamh.Message(pamh.PAM_PROMPT_ECHO_OFF,"Password")
+
def pam_sm_authenticate(pamh, flags, argv):
  )
+
  resp=pamh.conversation(
  try:
+
    pamh.Message(pamh.PAM_PROMPT_ECHO_OFF,"Password")
    user = pamh.get_user(None)
+
  )
  except pamh.exception, e:
+
  try:
    return e.pam_result
+
    user = pamh.get_user(None)
  if user == None:
+
  except pamh.exception, e:
    return pamh.PAM_USER_UNKNOWN
+
    return e.pam_result
  try:
+
  if user == None:
    def safeConfigGet(sect,key):
+
    return pamh.PAM_USER_UNKNOWN
      if config.has_option(sect,key):
+
  try:
        return config.get(sect,key)
+
    def safeConfigGet(sect,key):
      else:
+
      if config.has_option(sect,key):
        None
+
        return config.get(sect,key)
    # Присваиваем переменным значения из конфига
+
      else:
    connargs={
+
        None
      'mysqldb': {  
+
    # Присваиваем переменным значения из конфига
        'host': safeConfigGet('database','host'),
+
    connargs={
        'user': safeConfigGet('database','user'),
+
      'mysqldb': {  
        'passwd': safeConfigGet('database','password'),
+
        'host': safeConfigGet('database','host'),
        'port': safeConfigGet('database','port'),
+
        'user': safeConfigGet('database','user'),
        'db': safeConfigGet('database','db')
+
        'passwd': safeConfigGet('database','password'),
      }
+
        'port': safeConfigGet('database','port'),
    }[dbengine]
+
        'db': safeConfigGet('database','db')
    # Фильтр пустых переменных
+
      }
    for k in connargs.keys():
+
    }[dbengine]
      if connargs[k] is None:
+
    # Фильтр пустых переменных
        del connargs[k]
+
    for k in connargs.keys():
    # Подключение к БД и выполнение sql запроса
+
      if connargs[k] is None:
    db=dbengineClass.connect( **connargs )
+
        del connargs[k]
    cursor=db.cursor()
+
    # Подключение к БД и выполнение sql запроса
    cursor.execute(config.get('query','select_statement'),(user))
+
    db=dbengineClass.connect( **connargs )
    # Присваиваем переменной pass_db
+
    cursor=db.cursor()
    pass_db=cursor.fetchone()[0]
+
    cursor.execute(config.get('query','select_statement'),(user))
    # Получаем из введеного пользователя пароля blowfish hash.
+
    # Присваиваем переменной pass_db
    pass_hash = bcrypt.encrypt(resp.resp,rounds=int(pass_db[6:8]),salt=pass_db[9:31])
+
    pass_db=cursor.fetchone()[0]
    #Маленькое недоразумение, здесь 2a=2y, текст из официальной документации :
+
    # Получаем из введеного пользователя пароля blowfish hash.
    #2y - format specific to the crypt_blowfish BCrypt implementation, identical to 2a in all but name.
+
    pass_hash = bcrypt.encrypt(resp.resp,rounds=int(pass_db[6:8]),salt=pass_db[9:31])
    pass_hash=pass_hash[0:2]+'y'+pass_hash[3:]
+
    #Маленькое недоразумение, здесь 2a=2y, текст из официальной документации :
    # Проверка хеша пароля и хеша их БД
+
    #2y - format specific to the crypt_blowfish BCrypt implementation, identical to 2a in all but name.
    if pass_db[2:]==pass_hash:
+
    pass_hash=pass_hash[0:2]+'y'+pass_hash[3:]
      return pamh.PAM_SUCCESS
+
    # Проверка хеша пароля и хеша их БД
    else:
+
    if pass_db[2:]==pass_hash:
      return pamh.PAM_AUTH_ERR
+
      return pamh.PAM_SUCCESS
  except Exception as e:
+
    else:
    return pamh.PAM_SERVICE_ERR
+
      return pamh.PAM_AUTH_ERR
  return pamh.PAM_SERVICE_ERR
+
  except Exception as e:
def pam_sm_setcred(pamh, flags, argv):
+
    return pamh.PAM_SERVICE_ERR
  return pamh.PAM_SUCCESS
+
  return pamh.PAM_SERVICE_ERR
def pam_sm_acct_mgmt(pamh, flags, argv):
+
def pam_sm_setcred(pamh, flags, argv):
  return pamh.PAM_SUCCESS
+
  return pamh.PAM_SUCCESS
def pam_sm_open_session(pamh, flags, argv):
+
def pam_sm_acct_mgmt(pamh, flags, argv):
  return pamh.PAM_SUCCESS
+
  return pamh.PAM_SUCCESS
def pam_sm_close_session(pamh, flags, argv):
+
def pam_sm_open_session(pamh, flags, argv):
  return pamh.PAM_SUCCESS
+
  return pamh.PAM_SUCCESS
def pam_sm_chauthtok(pamh, flags, argv):
+
def pam_sm_close_session(pamh, flags, argv):
  return pamh.PAM_SUCCESS
+
  return pamh.PAM_SUCCESS
 
+
def pam_sm_chauthtok(pamh, flags, argv):
 +
  return pamh.PAM_SUCCESS
 +
</pre>
 
* Произвести требуемые настройки конфига питон-скрипта '''/etc/security/pam_dbauth.conf''':
 
* Произвести требуемые настройки конфига питон-скрипта '''/etc/security/pam_dbauth.conf''':
[database]
+
<pre>
host=localhost
+
[database]
user=ownclouduser
+
host=localhost
password=
+
user=ownclouduser
db=owncloud_db
+
password=
engine=mysqldb
+
db=owncloud_db
[query]
+
engine=mysqldb
select_statement=select password from oc_users where uid=%s
+
[query]
 
+
select_statement=select password from oc_users where uid=%s
 
+
</pre>
 
Чтобы посмотреть свой логин и пароль для подключения к mysql, нужно глянуть '''/srv/owncloud/config/config.php''' .
 
Чтобы посмотреть свой логин и пароль для подключения к mysql, нужно глянуть '''/srv/owncloud/config/config.php''' .
  
 
* Поставить необходимое пакеты:
 
* Поставить необходимое пакеты:
  
apt-get install ....(допишу чуть позже)
+
'''apt-get install python-pam python2.7-mysqldb python-passlib python-bcrypt'''<br>
 +
Некоторые пакеты мог забыть указать, учитывайте это.
  
 
* Для проверки работы можно использовать следующие команды:
 
* Для проверки работы можно использовать следующие команды:
  
1.python /lib/security/pam_dbauth.py
+
1.
 
+
<pre>
2.pamtester samba user authenticate
+
python /lib/security/pam_dbauth.py
 
+
</pre>
user - пользователь, который работает с owncloud
+
2.
 +
<pre>
 +
apt-get install pamtester
 +
pamtester samba user authenticate
 +
</pre>
 +
'''user''' - пользователь, который работает с owncloud.
 +
<br>
 +
3. Также в самом скрипте закомментирована строчка с отладкой. Пишет свои логи в '''/var/log/syslog'''.
 +
==SAMBA==

Текущая версия на 09:35, 30 июня 2016

PAM

Для связи owncloud и pam нужно сделать следующее:

  • Настроить pam правило, делается это в конфиге /etc/pam.d/samba:
# @include common-auth
# @include common-account
# @include common-session-noninteractive
#%PAM-1.0
# auth       requisite   pam_python.so pam_accept.py
auth         required    pam_python.so pam_dbauth.py
account      required    pam_python.so pam_dbauth.py
session      required    pam_python.so pam_dbauth.py
password     required    pam_python.so pam_dbauth.py
  • Создать /lib/security/pam_dbauth.py со следующим содержимым:
# -*- coding: utf-8 -*-
import syslog
import hashlib
import base64
import string
import sys
from passlib.hash import bcrypt
import ConfigParser
# Можно использовать для отладки, ура!
# syslog.syslog ("script: Called.") 
config = ConfigParser.ConfigParser()
config.read('/etc/security/pam_dbauth.conf')
dbengine=config.get('database','engine')
import MySQLdb
dbengineClass=MySQLdb
def pam_sm_authenticate(pamh, flags, argv):
  resp=pamh.conversation(
    pamh.Message(pamh.PAM_PROMPT_ECHO_OFF,"Password")
  )
  try:
    user = pamh.get_user(None)
  except pamh.exception, e:
    return e.pam_result
  if user == None:
    return pamh.PAM_USER_UNKNOWN
  try:
    def safeConfigGet(sect,key):
      if config.has_option(sect,key):
        return config.get(sect,key)
      else:
        None
    # Присваиваем переменным значения из конфига
    connargs={
      'mysqldb': { 
        'host': safeConfigGet('database','host'),
        'user': safeConfigGet('database','user'),
        'passwd': safeConfigGet('database','password'),
        'port': safeConfigGet('database','port'),
        'db': safeConfigGet('database','db')
      }
    }[dbengine]
    # Фильтр пустых переменных
    for k in connargs.keys():
      if connargs[k] is None:
        del connargs[k]
    # Подключение к БД и выполнение sql запроса
    db=dbengineClass.connect( **connargs )
    cursor=db.cursor()
    cursor.execute(config.get('query','select_statement'),(user))
    # Присваиваем переменной pass_db
    pass_db=cursor.fetchone()[0]
    # Получаем из введеного пользователя пароля blowfish hash.
    pass_hash = bcrypt.encrypt(resp.resp,rounds=int(pass_db[6:8]),salt=pass_db[9:31])
    #Маленькое недоразумение, здесь 2a=2y, текст из официальной документации :
    #2y - format specific to the crypt_blowfish BCrypt implementation, identical to 2a in all but name.
    pass_hash=pass_hash[0:2]+'y'+pass_hash[3:]
    # Проверка хеша пароля и хеша их БД
    if pass_db[2:]==pass_hash:
      return pamh.PAM_SUCCESS
    else:
      return pamh.PAM_AUTH_ERR
  except Exception as e:
    return pamh.PAM_SERVICE_ERR
  return pamh.PAM_SERVICE_ERR
def pam_sm_setcred(pamh, flags, argv):
  return pamh.PAM_SUCCESS
def pam_sm_acct_mgmt(pamh, flags, argv):
  return pamh.PAM_SUCCESS
def pam_sm_open_session(pamh, flags, argv):
  return pamh.PAM_SUCCESS
def pam_sm_close_session(pamh, flags, argv):
  return pamh.PAM_SUCCESS
def pam_sm_chauthtok(pamh, flags, argv):
  return pamh.PAM_SUCCESS
  • Произвести требуемые настройки конфига питон-скрипта /etc/security/pam_dbauth.conf:
[database]
host=localhost
user=ownclouduser
password=
db=owncloud_db
engine=mysqldb
[query]
select_statement=select password from oc_users where uid=%s

Чтобы посмотреть свой логин и пароль для подключения к mysql, нужно глянуть /srv/owncloud/config/config.php .

  • Поставить необходимое пакеты:

apt-get install python-pam python2.7-mysqldb python-passlib python-bcrypt
Некоторые пакеты мог забыть указать, учитывайте это.

  • Для проверки работы можно использовать следующие команды:

1.

python /lib/security/pam_dbauth.py

2.

apt-get install pamtester
pamtester samba user authenticate

user - пользователь, который работает с owncloud.
3. Также в самом скрипте закомментирована строчка с отладкой. Пишет свои логи в /var/log/syslog.

SAMBA