Inner Source Project Management

Inner beauty1
Photo: Inner beauty1 by Sudarshan V. Creative Commons Attribution License

Tal vez has oído hablar de ello antes, Inner Source Project Management es la denominación que se da a la adopción de prácticas comunes en proyectos Open Source por parte de cualquier empresa. Implica asimilar características de un proyecto Open Source sin realmente serlo, cumpliendo los requerimientos que tiene todo desarrollo dentro de una empresa.

Es un enfoque que abre la posibilidad a cualquier miembro de la organización de embarcarse en él, como puede pasar en las típicas comunidades Open Source, pero el resultado es un producto cuyo propietario es la empresa y su código no es libre: sólo pueden acceder a él los trabajadores de la organización. La idea es que cualquier miembro del negocio pueda contribuir en el proyecto,  siendo el resultado final un producto cerrado.

Muchas serían las bondades para adoptar este modelo: el reciclaje o reutilización de código, que se va almacenando en un repositorio común dentro de la organización, pudiendo ser usado en cualquier otro proyecto. La calidad del resultado final: al aportar la organización un gran número de personas, las continuas revisiones realizadas favorecen a la mejora del producto . La mejora en la velocidad de cualquier desarrollo por parte de los miembros de la organización, ya que usan herramientas y código comunes en este proyecto que luego pueden usar en otros dentro de la organización. Aprendizaje y transmisión de conocimiento en la masa de desarrolladores: tienes a toda la empresa colaborando y aportando. Si el objetivo del proyecto es algo que toda la empresa va a usar: un sistema operativo, una aplicación, una herramienta; hace que el valor económico dentro de la organización y el conocimiento generado sean altísimos.

Desde aquí animo a otras organizaciones a intentar adoptar algún modelo (infraestructura, soporte de proyectos) que facilite la creación con enfoque Inner Source, siendo este breve artículo una introducción. Se puede encontrar mucha más documentación y ejemplos reales en libros y webs.

Políticas de contraseñas en Fedora 25

Fedora server
A menudo usamos nuestro sistema Linux con configuraciones estándar en nuestras máquinas de escritorio… y en nuestros servidores. Los usuarios usan una única cuenta para administrar las máquinas, usan claves rsa sin encriptar, dichas claves rsa están en sus máquinas en discos no encriptados, no usan contraseña para loguearse, no se bloquea la cuenta por inactividad, y un largo etcétera que no quiero ni enumerar, me da mucho miedo sólo el pensarlo.

Después de éste pequeño repaso a muchos peligros que algunos de nosotros tenemos alrededor, vamos a centrarnos. Concretamente en servidores montados con Fedora 25 que es de los últimos que he tenido que configurar con unas políticas de seguridad y acceso marcadas por una compañía.

El manejo de políticas de autenticación a través de Pluggable Authentication Modules (PAM) que en su versión de Fedora 25 ha dejado de usar /etc/pam.conf por el directorio /etc/pam.d/ no está muy bien documentado, sobretodo en lo referente a qué hace cada parámetro y cómo lo podemos usar.

Para nuestro caso, cambiaremos la configuración para poder limitar intentos de password, longitud mínima, complejidad de la contraseña (3 de estas cuatro características: mayúsculas, minúsculas, números y símbolos), evitar nombre de usuario en la contraseña, revisar diccionario para no usar como contraseña cadenas ahí incluidas o forzar la política para todos los usuarios, incluido root.

Pasamos a revisar el fichero que nos interesa para realizar todos estos cambios /etc/pam.d/system-auth

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

pam_pwquality.so es un módulo para comprobar la calidad de las contraseñas. Hay otros, como pam_cracklib o pam_passwdqc que se podrían usar en sustitución de pam_pwquality.so. Cada uno tiene sus características. La carga de uno u otro módulo se define en el fichero /etc/sysconfig/authconfig.

Nos va a interesar de pam_pwquality.so:

debug: al usar este parámetro se muestra el funcionamiento del módulo en el log del sistema
retry=3: número de intentos para introducir la cadena.
minlen=15: longitud mínima que debe usarse.
minclass=3: al menos 3 de cuatro características deben cumplirse (mayúsculas, minúsculas, símbolos y números)
reject_username: al activarlo impedimos usar la cadena nombre de usuario como parte de la contraseña tanto en orden natural como inverso.
gecoscheck=1: impedir el uso de cadenas del campo GECOS (normalmente nombre de usuario largo).
enforce_for_root: hacer que la directiva también se use con "root".

Además, este módulo carga el diccionario que tenga de manera estándar el sistema. Yo no pude hacer cargar el mío propio, pero sí pude añadir las palabra que me interesaban al que usa de manera predeterminada el sistema, de la siguiente manera:

create-cracklib-dict <fichero de texto con las cadenas> 

Finalmente la configuración quedaría como:

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so

password    requisite     pam_pwquality.so debug retry=3 minlen=15 minclass=3 reject_username gecoscheck=1 enforce_for_root
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

Y recargamos la configuración con:


authconfig --updateall

.

Nuevos cursos en la universidad de Stanford

Logotipo Stanford UniversityHoy he visto anunciados los 16 nuevos cursos para este semestre de la universidad de Stanford. Con la decadencia que está sufriendo la universidad tradicional (subidas de tasas, nuevos planes de estudios, despidos de profesorado, etc) creo que la mejor manera de adquirir conocimiento está en uno mismo y en su capacidad de buscar lo que mejor se adapte a sus propios gustos o necesidades y las de su entorno. Internet ha democratizado el conocimiento y lo que antes sólo tenía cabida para una élite a la que se le permitía el acceso ahora puede estar en tus manos en cuestión de segundos.
Este tipo de formación tutorizada, pero a la vez viva y colaborativa es mucho más útil que la rigidez de los planes de estudio tradicionales. Dos personas pueden estar realizando el mismo curso y finalizar con unos conocimientos diferentes, lo que enriquece el resultado final. Con esto no quiero decir que no sea necesaria la formación académica reglada, pero creo que hay otras formas de aprender. Vamos a tener que estar en continuo aprendizaje durante nuestra vida y los métodos tradicionales no son idóneos.