domingo, 10 de abril de 2016

Instalar OpenLdap con samba en debian wheezy

Instalar OpenLdap con samba en Debian Wheezy

La presente guía es para mostrar la manera correcta de instalar openldap y samba bajo linux para poder tener un servidor de autenticación centralizado y samba para que nos provea un controlador de dominio, en este caso primario. Su aplicación en micro y pequeñas redes (de 10 - 10000 tablas sin problemas) es de mucha utilidad y relativamente cómoda administración.
De más está decir que el coste económico es cero, ya que como administradores de redes, jefes de infraestructura deberíamos tenerlo presente con la finalizad de minimizar los costes del área de TI.
Voy a tratar de ser lo más sencillo posible los pasos y colocaré todos los archivos de configuración para no dejar nada vacío.

Condiciones iniciales:
Dominio    =   mipc.com
ip-address  =   172.16.0.3
netmask     =   255.255.255.0
hostname   =   ldap.mipc.com
Gateway    =   172.16.0.1
Serv. DNS =   ns.mipc.com        =   172.16.0.1
Serv. web  =    www.mipc.com  =   172.16.0.4

Empecemos:

1. Instalación  de ldap y samba.
aptitude install slapd ldap-utils samba-doc libnss-ldap libpam-ldap nscd samba smbclient smbldap-tools ldap-account-manager-lamdaemon

Se contesta todo por default, ya que vamos a modificar los archivos de configuración

ejecutar lo siguiente:
# zcat /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz > /etc/ldap/schema/samba.schema
# slappaswd    -------------> al ejecutar se ingresa la contraseña del administrador del árbol ldap
# ldap-account-manager-lamdaemon
# adduser ldapadmin
# slaptest -v -u
# rm -rf /var/lib/ldap/*
# service nscd restart
# mkdir -p /var/lib/samba/netlogon /var/lib/samba/profiles
# chown -Rf root:root /var/lib/samba/netlogon /var/lib/samba/profiles
# chmod 1777 /var/lib/samba/profiles
# zcat /usr/share/doc/smbldap-tools/examples/smbldap.conf.gz > /etc/smbldap-tools/smbldap.conf
# cp /usr/share/doc/smbldap-tools/examples/smbldap_bind.conf /etc/smbldap-tools/smbldap_bind.conf
# chmod 640 /etc/smbldap-tools/smbldap.conf /etc/smbldap-tools/smbldap_bind.conf
# chown root:openldap /etc/smbldap-tools/smbldap.conf /etc/smbldap-tools/smbldap_bind.conf
# net getlocalsid
# smbldap-populate
# pdbedit -L
# pdbedit -Lv root


Ahora voy a dejar los archivos de configuración para que lo adapten a sus necesidades.

nano /etc/ldap/ldap.conf
BASE    dc=mipc,dc=com
URI     ldap://ldap.mipc.com
TLS_CACERT      /etc/ssl/certs/ca-certificates.crt

nano /etc/ldap/slapd.conf
include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/nis.schema
include         /etc/ldap/schema/inetorgperson.schema
include         /etc/ldap/schema/samba.schema
pidfile         /var/run/slapd/slapd.pid
argsfile        /var/run/slapd/slapd.args
loglevel        none
modulepath      /usr/lib/ldap
moduleload      back_hdb
sizelimit 500
tool-threads 1
backend         hdb
database        hdb
suffix          "dc=mipc,dc=com"
rootdn          "uid=ldapadmin,ou=Usuarios,dc=mipc,dc=com"
rootpw          {SSHA}flssWgKAVN+9l2nhpd7NkOgpNStVBsK0
directory       "/var/lib/ldap"
dbconfig set_cachesize 0 2097152 0
dbconfig set_lk_max_objects 1500
dbconfig set_lk_max_locks 1500
dbconfig set_lk_max_lockers 1500
index   objectClass                     eq,pres
index   ou,cn,sn,mail,givenname         eq,pres,sub
index   uidNumber,gidNumber,memberUid   eq,pres
index   loginShell                      eq,pres
index   uid                             pres,sub,eq
index   displayName                     pres,sub,eq
index   nisMapName,nisMapEntry          eq,pres,sub
index   sambaSID                        eq
index   sambaPrimaryGroupSID            eq
index   sambaDomainName                 eq
index   default                         sub
index   uniqueMember                    eq
index   sambaGroupType                  eq
index   sambaSIDList                    eq
lastmod         on
checkpoint      512 30
access to attrs=userPassword,sambaNTPassword,sambaLMPassword,sambaPwdMustChange,sambaPwdLastSet
        by self write
        by anonymous auth
        by * none
access to attrs=shadowLastChange,shadowMax
        by self write
        by * read
access to *
        by * read

nano /etc/libnss-ldap.conf
base dc=mipc,dc=com
uri ldap://172.16.0.3/
ldap_version 3
rootbinddn uid=ldapadmin,ou=Usuarios,dc=mipc,dc=com
bind_policy soft
pam_filter objectclass=PosixAccount
pam_login_attribute uid
pam_password crypt
nss_base_passwd ou=Usuarios,dc=mipc,dc=com?one
nss_base_shadow ou=Usuarios,dc=mipc,dc=com?one
nss_base_group          ou=Grupos,dc=mipc,dc=com?one

nano /etc/nsswitch.conf
passwd:         files ldap
group:          files ldap
shadow:         files ldap
hosts:          files dns
networks:       files
protocols:      db files
services:       db files
ethers:         db files
rpc:            db files
netgroup:       nis

nano /etc/pam_ldap.conf
base dc=mipc,dc=com
uri ldap://172.16.0.3/
ldap_version 3
rootbinddn uid=ldapadmin,ou=Usuarios,dc=mipc,dc=com
bind_policy soft
pam_filter objectclass=PosixAccount
pam_login_attribute uid
pam_password crypt
nss_base_passwd ou=Usuarios,dc=mipc,dc=com?one
nss_base_shadow ou=Usuarios,dc=mipc,dc=com?one
nss_base_group          ou=Grupos,dc=mipc,dc=com?one

nano /etc/pam.d/common-account
account [success=2 new_authtok_reqd=done default=ignore]        pam_unix.so 
account [success=1 default=ignore]      pam_ldap.so 
account requisite                       pam_deny.so
account required                        pam_permit.so

nano /etc/pam.d/common-auth
auth    [success=2 default=ignore]      pam_unix.so nullok_secure
auth    [success=1 default=ignore]      pam_ldap.so use_first_pass
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so

nano /etc/pam.d/common-password
password        [success=2 default=ignore]      pam_unix.so obscure crypt
password        [success=1 user_unknown=ignore default=die]     pam_ldap.so use_authtok try_first_pass
password        requisite                       pam_deny.so
password        required                        pam_permit.so

nano /etc/pam-.d/common-session
session [default=1]                     pam_permit.so
session requisite                       pam_deny.so
session required                        pam_permit.so
session required        pam_unix.so 
session required        pam_mkhomedir.so 
session optional                        pam_ldap.so 

nano /etc/pam-.d/common-session-noninteractive
session [default=1]                     pam_permit.so
session requisite                       pam_deny.so
session required                        pam_permit.so
session required        pam_unix.so 
session required        pam_mkhomedir.so 
session optional                        pam_ldap.so 

nano /etc/samba/smb.conf
[global]
dos charset = 850
Unix charset = ISO8859-1
workgroup = mipc.com
realm = mipc.com
server string = %h server
map to guest = Bad User
username map = /etc/samba/smbusers
passdb backend = ldapsam:ldap://127.0.0.1/
ldap admin dn = uid=ldapadmin,ou=Usuarios,dc=mipc,dc=com
ldap delete dn = Yes
ldap user suffix = ou=Usuarios
ldap group suffix = ou=Grupos
ldap machine suffix = ou=Maquinas
ldap idmap suffix = ou=idmap
ldap suffix = dc=mipc,dc=com
ldap ssl = no
add user script = /usr/sbin/smbldap-useradd -m %u
delete user script = /usr/sbin/smbldap-userdel %u
add group script = /usr/sbin/smbldap-groupadd -p %g
delete group script = /usr/sbin/smbldap-groupdel %g
add user to group script = /usr/sbin/smbldap-groupmod -m %u %g
delete user from group script = /usr/sbin/smbldap-groupmod -x %u %g
set primary group script = /usr/sbin/smbldap-usermod -g %g %u
add machine script = /usr/sbin/smbldap-useradd -W %u
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
interfaces = eth0 lo
hosts allow = 127.0.0.1, 172.16.0.0/24
hosts deny = 0.0.0.0
smb ports = 139 445
bind interfaces only = Yes
name resolve order = wins hosts lmhosts bcast
remote announce = 172.16.0.255
unix password sync = yes
ldap passwd sync = yes
passwd program = /usr/sbin/smbldap-passwd -u %u
passwd chat = "Changing *\nNew password*" %n\n "*Retype new password*" %n\n"
logon script = 'logon.bat %U'
logon path = \\%N\profiles\%U
logon path =
logon drive = U:
domain logons = Yes
os level = 65
preferred master = Yes
domain master = Yes
dns proxy = No
wins support = Yes
panic action = /usr/share/samba/panic-action %d
map acl inherit = Yes
case sensitive = No
hide unreadable = Yes
syslog = 0
log file = /var/log/samba/log.%m
max log size = 1000
time server = Yes
[homes]
comment = Home Directories
valid users = %S
read only = No
create mask = 0611
directory mask = 0711
browseable = No
[printers]
comment = All Printers
path = /var/spool/samba
create mask = 0611
directory mask = 0711
printable = Yes
browseable = No
[print$]
comment = Printer Drivers
path = /var/lib/samba/printers
create mask = 0611
directory mask = 0711
[netlogon]
path = /var/lib/samba/netlogon
browseable = No
create mask = 0611
directory mask = 0711
[profiles]
path = /var/lib/samba/profiles
force user = %U
read only = No
create mask = 0611
directory mask = 0711
guest ok = Yes
profile acls = Yes
browseable = No
csc policy = disable
[public]
path = /tmp
read only = No
guest ok = Yes
create mask = 0611
directory mask = 0711

nano /etc/smbldap-tools/smbldap.conf
SID="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"  # ----------> colocar lo que sale de ejecutar net getlocalsid
sambaDomain="mipc.com"
slaveLDAP="172.16.0.3"
slavePort="389"
masterLDAP="172.16.0.3"
masterPort="389"
ldapTLS="0"
ldapSSL="0"
verify="require"
cafile="/etc/smbldap-tools/ca.pem"
clientcert="/etc/smbldap-tools/smbldap-tools.example.com.pem"
clientkey="/etc/smbldap-tools/smbldap-tools.example.com.key"
suffix="dc=mipc,dc=com"
usersdn="ou=Usuarios,dc=mipc,dc=com"
computersdn="ou=Maquinas,dc=mipc,dc=com"
groupsdn="ou=Grupos,dc=mipc,dc=com"
idmapdn="ou=Idmap,${suffix}"
sambaUnixIdPooldn="sambaDomainName=${sambaDomain},${suffix}"
scope="sub"
password_hash="CRYPT"
password_crypt_salt_format="%s"
userLoginShell="/bin/bash"
userHome="/home/%U"
userHomeDirectoryMode="700"
userGecos="System User"
defaultUserGid="513"
defaultComputerGid="515"
skeletonDir="/etc/skel"
shadowAccount="1"
defaultMaxPasswordAge="345"
userSmbHome="\\ldap\%U"
userProfile="\\ldap\profiles\%U"
userHomeDrive="U:"
userScript="logon.bat"
mailDomain="mipc.com"
with_smbpasswd="0"
smbpasswd="/usr/bin/smbpasswd"
with_slappasswd="0"
slappasswd="/usr/sbin/slappasswd"

nano /etc/smbldap-tools/smbldap_bind.conf
slaveDN="uid=ldapadmin,ou=Usuarios,dc=mipc,dc=com"
slavePw="yyyyyyy"       # ----------------------------> poner la contraseña de ldapadmin en texto plano
masterDN="uid=ldapadmin,ou=Usuarios,dc=mipc,dc=com"
masterPw="yyyyyyy"     # ----------------------------> poner la contraseña de ldapadmin en texto plano


Con todo esto no hay pierde.
Saludos.




sábado, 6 de febrero de 2016

Controlar remotamente Raspberry Pi vía web

En ésta nueva entrada voy a exponer mi manera de para poder controlar los puertos GPIO de la Raspberry Pi de manera remota, utilizando Lighttpd y php como servidor web, navegadores web y smartphone android como clientes.
Actualmente cuento con 1 placa Raspberry Pi rev2.0 y 1 placa Raspberry Pi 2 con la que realizo mis pruebas caseras, lo he realizado en ambos hardwares sin problemas ni cambios relevantes.
El presente repaso lo realizaré en la raspberry Pi 1 rev2.0

Vamos a instalar el servidor lighttpd por ser muy ligero en comparación con apache2. Usaremos php para programar la página web a la que se tendrá acceso vía web y vía aplicativo android. Usaremos scripts en python y bash muy básicos para poder controlar los puertos GPIO de la raspberry.
Desde php llamaremos a los scripts para que interactúe con el usuario.
La práctica consiste en prender, apagar y parpadear un led desde python y/o bash conectado al pin 11 del conector P1. El ánodo será conectado a una resistencia de 4.7k a voltaje para limitar la corriente y el cátodo al pin 11.

Empecemos:

pi@raspberry~$ sudo aptitude install lighttpd php-config php-pear php-xml-parser php5-cgi php5-cli php5-common
No voy a explicar la configuración de php con lighttpd ya que hay abundante información de ello en la web.
Recomiendo la lectura del siguiente blog propiedad de que a mi parecer está muy bien explicados los pasos básicos para poner en marcha lighttpd y php:
http://blog.desdelinux.net/lighttpd-un-servidor-web-muy-agil-y-liviano/

Ahora vamos a /var/www y dentro crearé la carpeta led. Dentro de la carpeta led crearemos el index.php que contendrá el código en php.
pi@raspberry /var/www/led~$ sudo vim index.php


<html>
<head>
<!--index.php-->
</head>
<body>
<!--GPIO17-->
<form action="" method="post">
Control de Led en el puerto 17

&nbsp;<input type="submit" name="prenderLED" value="Prender">
<input type="submit" name="apagarLED" value="Apagar">
<input type="submit" name="parpadearLED" value="Parpadear">
</body>
</html>
<?php
// Funciones PHP del pin GPIO 17
if ($_POST[prenderLED]) {
exec("sudo python /var/www/led/gpio/prenderLED.py");
}
if ($_POST[apagarLED]) {
exec("sudo python /var/www/led/gpio/apagarLED.py");
}
if ($_POST[parpadearLED]) {
exec("sudo python /var/www/led/gpio/parpadearLED.py");
}
// Fin Funciones PHP del pin GPIO 17
?>

Debería quedar así:

Control de Led en el puerto 17
Raspberry Pi rev2.0
 

Luego dentro de la carpeta led, crearé la carpeta gpio; aquí alojaré los scripts en python y bash que serán llamados por el index.php.
Usaremos el pin gpio 17, ya que es el número 0 en la tabla de comparación con WiringPi.

pi@raspberry /var/www/led/~$ mkdir gpio
pi@raspberry /var/www/led/gpio~$ nano prendeLED.py
#!/usr/bin/env/ python
## enciende.py
#Importamos la libreria y le cambiamos el nombre a GPIO
import RPi.GPIO as GPIO
#Establecemos el sistema de numeracion que queramos, 
#en este caso el sistema BCM
GPIO.setmode(GPIO.BCM)
#Configuramos el pin GPIO 17 como una salida
GPIO.setup(17, GPIO.OUT)
#Encendemos el led
GPIO.output(17, GPIO.HIGH)
GPIO.cleanup(); Liberamos el GPIO 17

pi@raspberry /var/www/led/gpio~$ nano apagaLED.py
#!/usr/bin/env/ python
## apaga.py
#Importamos la libreria y le cambiamos el nombre a GPIO
import RPi.GPIO as GPIO
#Establecemos el sistema de numeracion que queramos, 
#en este caso el sistema BCM
GPIO.setmode(GPIO.BCM)
#Configuramos el pin GPIO 17 como una salida
GPIO.setwarnings(False)
GPIO.setup(17, GPIO.OUT)
#Apagamos el led
GPIO.output(17, GPIO.LOW)
#Y liberamos el GPIO 17
GPIO.cleanup()

pi@raspberry /var/www/led/gpio~$ nano parpadearLED.py
#!/usr/bin/env/ python
import RPi.GPIO as GPIO
import time
#Establecemos el sistema de numeracion que queramos, 
#en este caso el sistema BCM
GPIO.setmode(GPIO.BCM)
#Configuramos el pin GPIO 17 como una salida
GPIO.setup(17, GPIO.OUT)
#Encendemos y apagamos el led 5 veces
for i in range(0,5):
 GPIO.output(17, GPIO.HIGH)
 time.sleep(1)
 GPIO.output(17, GPIO.LOW)
 time.sleep(1)
#Y liberamos el GPIO 17
GPIO.cleanup()

Ahora creamos los scripts en bash si es que no queremos hacerlo en python.

pi@raspberry /var/www/led/gpio~$ nano prenderLED.sh
#!/bin/bash
echo 17 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio17/direction
echo 0 > /sys/class/gpio/gpio17/value
#Liberamos el PIN asociado
echo 17 > /sys/class/gpio/unexport

pi@raspberry /var/www/led/gpio~$ nano apagarLED.sh
#!/bin/bash
echo 17 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio17/direction
echo 1 > /sys/class/gpio/gpio17/value
echo 17 > /sys/class/gpio/unexport

pi@raspberry /var/www/led/gpio~$ nano parpadearLED.sh
#!/bin/bash
echo 17 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio17/direction
for i in $(seq 1 5)
 do
   echo 1 > /sys/class/gpio/gpio17/value
   sleep 1
   echo 0 > /sys/class/gpio/gpio17/value
   sleep 1
 done
echo 17 > /sys/class/gpio/unexport

Ahora estoy trabajando en crear un apk que pueda controlarlo vía android. Existe una página llamada AppInventor para poder crear nuestro código online y así no tener que instalar el pesado Android Studio.
Cuando culmine, incluiré el código.
Por lo pronto hasta aquí.
Saludos;
JPC