Anda di halaman 1dari 19

Desarrollo de aplicaciones con

Software Libre.
Gua de Buenas Prcticas.
Celvin Rivas.
Hollycows.com

ndice de contenido
Introduccin...............................................................................................................................................3
En que consiste el modelo de software propietario?................................................................................4
Software Libre............................................................................................................................................5
Buenas prcticas para la implementacin..................................................................................................7
Instalacin de servidor LAPP en CentOS 7.x (64bits)..........................................................................7
Instalacin de los repositorios especializados para los aplicativos de CentOS 7.x 64bits...............7
Instalacin de Apache, PHP y Mdulos de postgreSQL.......................................................................8
Configurar IPTables para httpd.........................................................................................................8
Instalando PostgreSQL 9.4....................................................................................................................9
Configurar IPTables PostgreSQL.....................................................................................................9
Configurar PostgreSQL....................................................................................................................9
Activar el log de Query...................................................................................................................10
Detalles finales:...................................................................................................................................11
PROCESADOR EFICIENTE PARA LA CREACIN MASIVA DE REPORTES PDF...................12
Creacin de virtualHost personalizado................................................................................................13
Configuraciones especiales para Apache2..........................................................................................14
Instalar nodeJS....................................................................................................................................15
Instalar Composer................................................................................................................................15
Esto aplica para aplicaciones construidas con PHP symfony2............................................................16
Permisos de escritura especficos para aplicaciones que necesitan escribir en carpetas pblicas
(SIASE, Symfony2, etc.).....................................................................................................................16
ANEXO1 (permisosweb.sh)...........................................................................................................18

Introduccin
El Software Libre es gratuito, seguro, aporta calidad, se basa en estndares abiertos,
tiene libertad para utilizarse en cualquier sitio, favorece la cultura de la colaboracin,
aumenta la capacidad tecnolgica, proporciona ahorro de gastos en informtica, reduce la
dependencia de proveedores y fomenta el desarrollo colaborativo.
Por el momento no se planea instalar de manera masiva software libre a nivel de
escritorio, sin embargo el rea de desarrollo de sistemas ha adoptado GNU/Linux para el
desarrollo de nuevas tecnologas sin incurrir en elevados costos de licenciamiento de
software.
Generalmente, las empresas de informtica estn acostumbradas a desarrollar
software a medida, sin suministrar las fuentes de cdigo a sus clientes manteniendo un
modelo de pago por licencias de uso, pero con el modelo de desarrollo en casa se corta ese
antiguo paradigma.
Nos encontramos en uno de esos momentos en los que toda la industria puede estar
cambiando de paradigma. En una industria cada vez mas competitiva las empresas deben
adaptarse y ajustarse a las variaciones para poder mantener su posicin de competitividad.
Durante aos, en el mundo del software, se ha vivido bajo un modelo de negocio muy
lucrativo para las empresas de desarrollo de software y muy poco ventajoso para el resto de
usuarios de software, el modelo de software propietario.

En que consiste el modelo de software


propietario?
El modelo de software propietario consiste bsicamente en que un programador escribe un
programa (cdigo fuente) lo compila y obtiene un fichero ejecutable (un conjunto de ordenes
que son entendidas y llevadas a cabo por una computadora), este ejecutable se vende a un
usuario que de esta manera puede comenzar a utilizar el programa. Pero al usuario se le
ponen ciertas restricciones para usar ese software, como por ejemplo el pago de una licencia
de uso cada cierto tiempo o que no pueda redistribuir el programa (dado que esto se
considera piratera y es un delito).
Que desventajas tiene este modelo de software? El software propietario tiene varias
desventajas, entre ellas desventajas econmicas, como por ejemplo el pago de elevadas
sumas en concepto de licencia de uso, pero no es esta la desventaja mas importante, hay
otras desventajas ms graves:
El no tener acceso al cdigo fuente provoca que el usuario sea completamente
dependiente del proveedor de software. Que significa esto? Significa que si el software
tiene defectos o se nos ocurre alguna mejora, debemos ponernos en contacto con el
proveedor para que lo corrijan o lo amplen. El proveedor y solo el proveedor es capaz
de subsanar un error o ampliar el funcionamiento.

Otra desventaja de no tener acceso al cdigo fuente es que nos impide aprender de
l, al no saber como se realizan ciertas funciones.

Y una desventaja muy seria es la seguridad, puesto que al no conocer el cdigo fuente
ni tener acceso al mismo, se corre el riesgo de ser vulnerados por cdigo malicioso
insertado en el aplicativo por parte del proveedor, esto es un caso comn en muchas
empresas conocido como parte inseparable del espionaje corporativo.

Y por ultimo encontramos desventajas en el costo en conexin con la dependencia


tecnolgica a un nico proveedor, los precios abusivos y las barreras intelectuales que
plantea este modelo de negocio proponen claras desventajas.

Software Libre
Existe una alternativa, el software libre. El software libre es una cuestin de libertad,
no
de precio. Para comprender este concepto, se debe pensar en la acepcin de libre como
en libertad de expresin y no como en libre sin costo.
El movimiento del software libre empez en 1984, cuando Richard Stallman dio a
conocer
el proyecto GNU, para crear una versin del sistema operativo Unix que respetara las
libertades de aquellos que lo utilizaran. La consecuencia de este proyecto fue la creacin
en 1985 de la Fundacin del Software Libre.
Cuando hablamos de libertad, nos referimos especialmente a cuatro clases de libertad
para los usuarios de software:
Libertad 0: la libertad para ejecutar el programa sea cual sea nuestro propsito.
(privado, educativo, pblico, comercial, etc.)
Libertad 1: la libertad para estudiar el funcionamiento del programa y adaptarlo
a nuestras necesidades. El acceso al cdigo fuente es condicin indispensable para esto.
Libertad 2: La libertad para redistribuir copias.
Libertad 3: La libertad para mejorar el programa y luego publicarlo. Haber tenido
acceso al cdigo fuente de antemano es condicin indispensable para esto.
Basados estas libertades en el Ministerio de Relaciones Exteriores hemos hecho una
recopilacin de software con licenciamiento libre (GPL, MIT, BSD, Creative commons, etc)
que facilite el desarrollo de aplicaciones web y que los componentes que se incluyan se
puedan modificar sin que la licencia nos limite en el uso y modificacin de una librera
necesaria para que nuestros desarrollos cumplan con las necesidades de los requerimientos
solicitados.
Por lo tanto las buenas prcticas al iniciar un desarrollo utilizando herramientas de
software libre se listan las siguientes:
1. Antes de incluir un componente en nuestra plataforma de desarrollo se debe analizar
su licencia, como base se puede asegurar que cumplen con por lo menos la libertad 0,
1 y 2. Algunas licencias permitidas que incluyen las 4 libertades son:
GPL
LGPL
BSD
Apache licence
MIT

2. Antes de incluir un componente en nuestra plataforma de desarrollo se debe tomar en


cuenta la comunidad que da soporte y/o desarrolla el componente, tomando en cuenta
las siguientes caractersticas:
Repositorio donde se almacena el cdigo fuente de la librera, se valora que sea un
servidor con reputacin elevada y con certificado SSL, se pueden recomendar los
siguientes:
https://github.com/
https://bitbucket.org/
https://packagist.org/
3. El repositorio debe tener por lo menos dos ramas de publicacin:
Dev-Master (Que representa al cdigo que esta en constante modificacin)
Stable (Que incluye al cdigo probado y depurado listo para produccin)
Tambin se valora la rama Master (que es la que contiene todo el cdigo que
ha sido depurado de las ramas dependientes)
4. Componentes para el desarrollo:

Software

Entornos Integrados de Desarrollo (IDE)


Enlace

Licencia

NetBeans

www.netbeans.org

CDDL y GPL v2

Eclipse

http://www.eclipse.org/

Eclipse Public License - v 1.0

Software
PostgreSQL 9.4

Software

Base de datos
Enlace
http://www.postgresql.org

Framework
Enlace

Licencia
BSD

Licencia

PHP Symfony2

https://symfony.com/

GPL y MIT compatible

AngularJS

https://angularjs.org

MIT License

Jquery

https://jquery.org

MIT License

PHP 5.5

https://www.php.net

PHP License v3.01

Buenas prcticas para la implementacin


Debemos tomar en cuenta la siguiente gua de buenas prcticas al implementar una
herramienta basada en PHP y especialmente en Symfony2.

Instalacin de servidor LAPP en CentOS 7.x (64bits)


Antes que todo revisar esta guia:
https://www.digitalocean.com/community/tutorials/initial-server-setup-with-centos-7

GNU/Linux
Apache / httpd
PostgreSQL 9.4.1
PHP 5.5.12

Instalacin de los repositorios especializados para los aplicativos de


CentOS 7.x 64bits
En las ultimas versiones basta lanzar este comando: yum install epel-release Si esto NO
FUNCIONA, entonces favor realizar los siguientes 2 bloques marcados en azul. Epel
Repository
{NOTA: Siempre se debe buscar el repositorio epel para verificar que no ha cambiado la versin}

# wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
# rpm -ivh epel-release-7-5.noarch.rpm
# yum repolist

Remi Repository:
{NOTA: Siempre se debe buscar el repositorio remi para verificar que no ha cambiado la versin}

# wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# rpm -Uvh remi-release-7.rpm

nano /etc/yum.repos.d/remi.repo
enabled =1
EL REPO
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

Instalacin de Apache, PHP y Mdulos de postgreSQL


# yum --enablerepo=remi,remi-php56 install httpd php php-common
# yum --enablerepo=remi,remi-php56 install php-pecl-apc php-cli php-pear php-pdo phpmysqlnd php-pgsql php-pecl-mongo php-sqlite php-pecl-memcache php-pecl-memcached
php-gd php-mbstring php-mcrypt php-snmp php-xml
# yum --enablerepo=remi,remi-php56 install php-gd php-mcrypt php-pgsql php-soap
# chkconfig --levels 235 httpd on
# service httpd restart
yum --enablerepo=remi,remi-php56 install php-intl

Configurar IPTables para httpd


Ejemplos: http://www.thegeekstuff.com/2011/01/redhat-iptables-flush/
# vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
# iptables -A INPUT -p tcp --dport 80 -j DROP

Instalando PostgreSQL 9.4


# rpm -Uvh http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/pgdg-centos94-9.41.noarch.rpm
# yum install postgresql94-server postgresql94-contrib
# yum --enablerepo=remi,remi-php56 install pgadmin3
# service postgresql-9.4 initdb
# chkconfig postgresql-9.4 on
# yum --enablerepo=remi,remi-php56 install phpPgAdmin
# /etc/init.d/postgresql-9.4 restart
# netstat -an | grep 543

Configurar IPTables PostgreSQL


# vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5432 -j ACCEPT
# iptables -A INPUT -p tcp --dport 5432 -j DROP
# service iptables restart

Configurar PostgreSQL
# vim /var/lib/pgsql/9.4/data/pg_hba.conf
# vim /var/lib/pgsql/9.4/data/postgresql.conf
$ su - postgres
$ createuser user1
$ createdb db1
$ psql
Set password and Grant access to the database db1 for user1:
postgres=# alter user user1 with encrypted password 'user1';
postgres=# grant all privileges on database db1 to user1;
postgres=# alter user postgres with password '***';
# service postgresql-9.4 restart

Activar el log de Query


{NOTA: El log de Query consume mucho discoduro, por lo tanto debe activarse solo si hay algn problema y se desea
revisar la aplicacin en modo debug, normalmente esto es necesario solo en ambiente de desarrollo}

# vim /var/lib/pgsql/9.4/data/postgresql.conf
log_statement = all
log_min_error_statement = error

Para revisar el log:


$ find / -iname '*pg_log*'
# tail -f /var/lib/pgsql/9.4/data/pg_log/postgresql-Wed.log

Configurar el Host
# vim /etc/sysconfig/network

NETWORKING=yes
HOSTNAME=***********.rree.gob.sv

# vim /etc/hosts
# vim /etc/httpd/conf/httpd.conf

Detalles finales:

La seguridad en CentOS puede causar: PostgreSQL error: could not connect to server:
Permission denied

# service httpd stop


# service postgresql-9.4 stop
# setsebool -P httpd_can_network_connect 1
# service httpd start
# service postgresql-9.4 start
Posftix Permission denied problem
# setsebool -P httpd_can_sendmail 1
Asistente de configuracin para IP-Tables
# system-config-firewall-tui
no responder ping
echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all
1) La seguridad de la aplicacin y la revisin de los mdulos bsicos para el correcto
funcionamiento se encuentran como anexos al final de este documento; en algunos
casos se incluyen en la carpeta setup la cual debe ser eliminada despus de la
instalacin y prueba de la herramienta web.
Los archivos que se incluyen son:
permisosweb.sh Configura los permisos de seguridad para archivos y
carpetas (anexo1)
setWrite.sh
Permite la escritura en las carpetas especficas para
subir archivos desde el cliente. (Este debe ser proporcionado por el
programador de la herramienta)
2) En el caso de la instalacin virtualizada con VMWare Player y para el correcto
funcionamiento es mandatario la instalacin de VMWare tools desde el menu
VirtualMachine, Seguramente tendr que hacerse de manera manual copiando el
contenido en un folder con permisos y ejecutando lo siguiente:
# chmod 777 -R ../software/vmware-tools/
# ./vmware-tools-upgrader-64
3) Se ha instalado OpenSSH-Server en el puerto 2222, en el firewall si se permite el
acceso a este puerto; es mandatorio agregar un poco de serguridad a OpenSSH
vim /etc/hosts.allow
sshd: XXXX.XXXX.XXXX.XXXX {lista de IP que si vamos a permitir por ssh}
vim /etc/hosts.deny
sshd: all

PROCESADOR EFICIENTE PARA LA CREACIN MASIVA DE REPORTES


PDF
Con el fin de ahorrar procesador y memoria del servidor a la hora de generar reportes, si la herramienta
es compatible con wkhtml2pdf entonces es mandatorio realizar el siguiente proceso.
yum install -y xorg-x11-fonts-75dpi
yum install -y xorg-x11-fonts-Type1

wget http://downloads.sourceforge.net/project/wkhtmltopdf/0.12.2.1/wkhtmltox-0.12.2.1_linux-centos7amd64.rpm
rpm -Uvh wkhtmltox-0.12.2.1_linux-centos7-amd64.rpm
yum install urw-fonts libXext libXrender fontconfig libxml2
*** Buscar la versin disponible de libfontconfig es posible que sea superior a libfontconfig.so.1

{NOTA: Es posible que SELINUX bloquee la ejecucin del procesador de archivos PDF, en ese caso debe seguirse la
siguiente instruccin}

# yum -y install policycoreutils-python


To allow wkhtmltopdf to run without disabling SELinux (PROT_EXEC|PROT_WRITE failed)
1. sudo su - (run as root to make the next steps simpler)
2. # tail -F /var/log/audit/audit.log | grep wkhtml > wkhtml.audit
(leave this running and continue to next step)
Esto podra estar en el dmesg, o se tiene que activar el log de selinux primero.
# auditd (Audit daemon)
3. try to load your web page that attempts to create a pdf, it will fail as before but now we
are logging.
4. CTRL+C to stop the process from step 2 (can skip to 7 if in a hurry, but it's strongly
suggested you use these review steps before making selinux exceptions permanent!)
5. cat wkhtml.audit | audit2allow -m wkhtmltopdf > wkhtmltopdf.te
6. review the wkhtmltopdf.te file to make sure new rules will be sensible. you will probably
see "allow httpd_t self:process execmem" and possibly "allow httpd_t var_t:file read"
depending on your setup
7. cat wkhtml.audit | audit2allow -M wkhtmltopdf
8. semodule -i wkhtmltopdf.pp (might take a minute, be patient)
You should now be able to load the pdf-creating page without error. If not, we have likely fixed
one problem and arrived at another--might need to repeat steps. Tail to wkhtml.audit2 this

time and cat it with the original when making a new module (or else you'll be undoing first
fix!):
tail -F ... > wkhtml.audit2
if audit2 is empty, there is a non-selinux problem. otherwise:
cat wkhtml.audit wkhtml.audit2 | audit2allow ...
---------#!!!! This avc can be allowed using the boolean 'httpd_execmem'
allow httpd_sys_script_t self:process execmem;
setsebool -P httpd_execmem 1

Debe instalarse en la ruta del sistema operativo la versin mas reciente (12.1):
(http://wkhtmltopdf.org/)
/usr/bin/wkhtmltopdf

Creacin de virtualHost personalizado


# chown -R apache:apache /var/www/html/database/
# vim /etc/httpd/conf/httpd.conf
Listen 80
NameVirtualHost *:80
# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
127.0.0.1 ****.****.com
::1

localhost localhost.localdomain localhost6 localhost6.localdomain6

Crear backups
postgres $ pg_dump -Fc database > database.dump.backup
Restaurar backups
postgres $ psql -U postgres -d database -f database.dump.backup

Configuraciones especiales para Apache2

Autenticacin http para carpetas especiales:

Crear htpassword:
# htpasswd -c /etc/phppgadmin/.htpasswd usuario
# Authorize for setup
<Directory /usr/share/phpmyadmin/setup>
<IfModule mod_authn_file.c>
AuthType Basic
AuthName "phpMyAdmin Setup"
AuthUserFile /etc/phpPgAdmin/htpasswd
</IfModule>
Require valid-user
</Directory>

Capeta con permisos especiales y variables de PHP

Alias /phpmyadmin /usr/share/phpmyadmin


<Directory /usr/share/phpmyadmin>
Options FollowSymLinks
DirectoryIndex index.php
<IfModule mod_php5.c>
AddType application/x-httpd-php .php
php_flag magic_quotes_gpc Off
php_flag track_vars On
php_flag register_globals Off
php_admin_flag allow_url_fopen Off
php_value include_path .
php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
php_admin_value open_basedir
/usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/
</IfModule>
</Directory>

Java es esencial
Seguir la siguiente guia para instalar java 8 (elegir centOS7)
http://tecadmin.net/install-java-8-on-centos-rhel-and-fedora/

configuracin general de PHP


vim /etc/php.ini
date.timezone ="America/El_Salvador"

memory_limit = 512M

Instalar nodeJS
yum install nodejs
yum install npm

Instalar Composer
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

Esto aplica para aplicaciones construidas con PHP symfony2 adaptado a usar NodeJs
rm -rf /var/www/html/database/vendor/mopa/bootstrapbundle/Mopa/Bundle/BootstrapBundle/Resources/public/bootstrap
app/console mopa:bootstrap:symlink:less
/usr/local/bin/node
npm install -g less
Permisos de escritura especficos para aplicaciones que necesitan escribir en carpetas pblicas
(database, Symfony2, etc.)

httpd_sys_rw_content_t
# semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/database/app/cache(/.*)?"
# semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/database/app/logs(/.*)?"
# restorecon -R /var/www/html/database/app/cache
# restorecon -R /var/www/html/database/app/logs

Lo siguiente es un ejemplo de como usarlo en userdir -semanage fcontext -a -t httpd_sys_rw_content_t "/home/usuariolocal/public_html/test/app/cache(/.*)?"


semanage fcontext -a -t httpd_sys_rw_content_t "/home/usuariolocal/public_html/test/app/logs(/.*)?"
restorecon -R /home/usuariolocal/public_html/test/app/cache
restorecon -R /home/usuariolocal/public_html/test/app/logs
setsebool -P httpd_enable_homedirs true
chcon -R -t httpd_sys_content_t /home/usuariolocal/public_html
chmod 777 -R /home/usuariolocal/public_html/test/

SELINUX (debug no utilizar esos comandos a menos que sepa lo que hace)
sestatus
setenforce 1
setenforce 0
netstat -nr

Referencias:
http://www.tecmint.com/linux-server-hardening-security-tips/

http://drivemeca.blogspot.com/2014/07/15-minutos-para-configurar-un-linux.html

http://blog.xenodesystems.com/2014/07/que-hacer-despues-de-instalar-centos7_15.html

/*en caso de un servidor de desarrollo MacOS*/


http://blog.xenodesystems.com/2014/08/como-instalar-os-x-en-virtualbox.html

ANEXO1 (permisosweb.sh)
{NOTA MUY IMPORTANTE: Es necesario proteger la aplicacin mediante la ejecucin de este
archivo en la raz del proyecto, sin embargo despus de ejecutarlo quedarn todos los archivos y
carpetas sobreprotegidos y ser necesario agregar permisos de escritura a carpetas especficas como por
ejemplo las carpetas de cache, logs, uploads.}
----------------------------------------------- permisosweb.sh -------------------------------------------------#!/bin/bash
# Guardar como permisosweb.sh y dar los permisos de ejecucin bsicos chmod +x permisosweb.sh
# Ejemplo de uso: ./script /var/www/html/
# Propsito: Establecer los permisos correctos para los archivos y directorios en un servidor WEB
# Autores: Celvin Rivas < josecelvin@gmail.com >, Vivek Gite < vivek@nixcraft.com >
# Este script es libre gracias a la licencia GPL version 2.0 o superior
# Establecera permisos root para el DocumentRoot de Apache / Lighttpd / Nginx
# + Dirs/Subdirs: read-only y ejecucin para otros
# + Files: read-only permission
# Se ha probado en Debian Linux v3/4/5/6, RHEL v2/3/4/5/6, Centos 5.5/6.5
# ------------------------------------------------------------------------------------------------_dir="${1:-.}"
_fperm="0444"
_dperm="0445"
_ugperm="root:root"
_chmod="/bin/chmod"
_chown="/bin/chown"
_find="/usr/bin/find"
_xargs="/usr/bin/xargs"

echo "Vamos a cambiar los permisos de los archivos y directorios en el webserver para establecer un
modo restrictivo read-only \"$_dir\""
read -p "La carpeta actual es ${PWD}. seguro de continuar (y / n) ?" ans
if [ "$ans" == "y" ]
then
echo "Cambiando el propietario a $_ugperm para $_dir..."
$_chown -R "${_ugperm}" "$_dir"

echo "Estableciendo los permisos $_fperm para la carpeta $_dir ...."


$_chmod -R "${_fperm}" "$_dir"

echo "Estableciendo los permisos $_dperm para la carpeta $_dir ...."


$_find "$_dir" -type d -print0 | $_xargs -0 -I {} $_chmod $_dperm {}
fi

#Nota: No olvidar que es necesario dar permisos de escritura al usuario web en las carpetas destinadas
#para ello, como por ejemplo uploads, y cache.

Anda mungkin juga menyukai