miércoles, 4 de abril de 2018

AWS - Actualizar un certificado SSL externo

Hoy os voy a explicar cómo lo hago yo para actualizar un certificado SSL en AWS, un certificado que se ha comprado fuera. Lo vamos a hacer en tres pasos, que son
  1. Codificar los certificados (pasar a .pem) 
  2. Subirlos a AWS 
  3. Cambiar el viejo por el nuevo
1) Para codificar el certificado nuevo vamos a necesitar
    domain.crt (el certificado que nos habrá enviado el proveedor)
    domain.key
    root.crt (es el Certificado Intermedio del tipo de SSL que hemos tramitado, que nos debería dar también el proveedor, sino mejor se lo pedimos). 
Para hacer la conversión y encriptar los archivos lo hacemos así (desde cualquier linux que tenga el paquete openssl instalado)

> rsa -in domain.key -outform PEM -out domain.key.pem
> x509 -inform PEM -in domain.crt -out domain.crt.pem
> x509 -inform PEM -in root.crt -out root.crt.pem
 
Ya los tienes codificados. Vamos a subirlos.

2)    Subirlos no es complicado, sólo necesitas un usuario IAM con permisos para subirlos. Aquí tienes la documentación de todas las políticas en ACM que necesitas para definir los permisos de tu usuario.

La subida la puedes hacer desde la consola de AWS o desde línea de comandos (habiendo instalado las AWS tools previamente). Desde el directorio donde tienes los certificados codificados, el comando sería este

> aws iam upload-server-certificate --server-certificate-name Nombre_del_Certificado --certificate-body file:/domain.crt.pem --private-key file:/domain.key.pem --certificate-chain file:/domain_2016_ca.crt.pem
 
Cuando este paso se hace bien, el sistema devuelve algo así:

{
    "ServerCertificateMetadata": {
        "ServerCertificateId": "ASCAJKNEFTXTK7XXXXXXX",
        "ServerCertificateName": "domain",
        "Expiration": "2019-07-21T23:59:59Z",
        "Path": "/",
        "Arn": "arn:aws:iam::xxxxxxxx:server-certificate/domain",
        "UploadDate": "2018-01-26T11:16:35.819Z"
    }
}
 
Sencillo, ¿no? El problema es cuando el usuario de AWS no tiene permisos, que hay que dárselos. El error es más del tipo:

A client error (AccessDenied) occurred when calling the UploadServerCertificate operation: User: arn:aws:iam::xxxxxxxx:user/USER is not authorized to perform: iam:UploadServerCertificate on resource: arn:aws:iam::xxxxxxxx:server-certificate/domain
 
En este caso, falta algún permisos; prueba a darle a tu usuario permisos IAMFullAccess y a quitárselos después de importar el certificado.

3)    Cambiar el nuevo certificado : Desde el panel de AWS, entra en EC2 y en el panel de la izquierda busca Load Balancing y justo debajo, Load Balancer. Busca el balanceador al que está asociado el certificado que vamos a actualizar, selecciónalo y vete a la pestaña "Listeners". Selecciona el HTTPS y edítalo. En el campo

Default SSL certificate
escoge el certificado que acabas de subir y guarda. Ya lo has cambiado.

domingo, 4 de febrero de 2018

Cómo volcar una BD SQL Server desde el RDS de AWS a un entorno on-premise (II)

Hola a todos!
En un primer post os estuve explicando cómo podéis hacer un export de una BD SQL Server en el RDS de AWS.

En este punto tenemos el backup del SQL en S3; para descargarlo necesitamos acceder a S3 y hacer que el archivo esté disponible desde internet. Para hacerlo, accede al panel de AWS y ve a S3; dentro del bucket tenemos el backup, con el mismo nombre que le has dado al hacer el export. Entra en este archivo y en la pestaña Overview hay un botón para hacerlo público:


También tienes el link externo del archivo. Cópialo y vamos al servidor donde vamos a importar esa base de datos

Recuerda borrar lo que vaya quedando en el bucket para que no se generen gastos no necesarios

Ahora tenemos que descargar e importar la base de datos en el entorno de on-premise. Vamos por partes:

1. Conéctate al servidor desde el que vas a lanzar la restauración, para descargar el backup en local.

2. Descarga el .BAK que hemos generado desde S3. Si ves que no te funciona el enlace por algún motivo, piensa que puedes entrar desde el servidor a la consola de AWS y descargarlo directamente. Ten localizada la descarga; yo la suelo mover a la raiz del disco en el que esté para tenerla controlada.

3. Abre el MS SQL y conecta al motor del SQL

4.Vamos a eliminar la BD. Recuerda avisar a quien sea necesario. Para eliminarla, ponla en modo offline primero para confirmar que no hay ninguna conexión abierta y de errores. Si lo haces con una query será algo así

ALTER DATABASE [database_name] SET OFFLINE WITH ROLLBACK IMMEDIATE
GO

Los corchetes “[“ y “]” no los quites, son parte de la query. Una vez la BD esté offline, podrás eliminarla sin problema.

5. Ahora ya podemos restaurar la BD. Lo vamos a hacer con esta otra query; modifica los campos que sean necesarios

RESTORE DATABASE [database_name] FROM DISK = 'c:\AAAAMMDD_backup.bak'
WITH MOVE 'database_mdf_name' TO 'C:\Program Files\Microsoft SQL
Server\MSSQL11.DEVW2012\MSSQL\DATA
\database_mdf_name.mdf',
MOVE 'database_log_name' TO 'C:\Program Files\Microsoft SQL
Server\MSSQL11.DEVW2012\MSSQL\DATA
\database_mdf_name.ldf
RECOVERY, REPLACE, STATS = 10;

6. Una vez acabe (puede tardar unos 5 o 10 minutos, dependiendo del tamaño), hay que habilitar el acceso a esta base de datos nueva. En Seguridad → Inicios de Sesion, busca el usuario que se utilizaba antes y vete a propiedades


Cuando se abra la ventana de propiedades, vete a Asignación de usuarios en el menú arriba a la izquierda

y selecciona la nueva base de datos en “Usuarios asignados a este inicio de sesión":


Una vez estén asignados, acepta y el backup estará restaurado del todo.

miércoles, 24 de enero de 2018

Cómo volcar una BD SQL Server desde el RDS de AWS a un entorno on-premise (I)

Hola! Hoy os traigo un tutorial algo más elaborado, y el primero (creo) en el que trabajo con AWS. Espero que no sea el único!

Para exportar una BD SQL Server desde AWS a un entorno on-premise, vamos a hacer un export a S3 y desde allí lo descargamos e importamos desde el entorno on premise.

En esta primera parte del tutorial vamos a hacer el export, y en una segunda parte, la importación en destino

Lo que primero vamos a necesitas será un usuario con permisos suficientes para poder exportar el backup y volcarlo en un bucket de S3; después necesitas tener ese bucket. Y por último, tener la opción SQLSERVER_BACKUP_RESTORE añadida a un grupo de opciones en tu instancia RDS.


Si ya tienes un usuario IAM puedes crear y asignarle la política específica para hacer exports/restores RDS o puedes crear un rol y asignarlo. En cualquier caso, la política que tienes que crear debería ser una de las tres definidas aquí.

Para hacer el export del SQLServer nos conectamos a la consola y ejecutamos este comando

exec msdb.dbo.rds_backup_database 
        @source_db_name='database_name',
        @s3_arn_to_backup_to='arn:aws:s3:::bucket_name/file_name_and_extension',
        @kms_master_key_arn='arn:aws:kms:region:account-id:key/key-id',
        @overwrite_S3_backup_file=1,
        @type='differential/FULL';

donde
  • @source_db_name hace referencia a la BD que vas a exportar
  • @s3_arn_to_backup_to hace referncia al bucket donde vas a exportar y al nombre del fichero con que se va a guardar
  • @kms_master_key_arn hace referencia a la encriptación del fichero, y es OPCIONAL
  • @overwrite_S3_backup_file hace referencia a si quieres sobreescribir el fichero en caso de que exista; 1 equivale a Sí y 0 a No. Es OPCIONAL, y por defecto es "1"
  • @type hace referencia al tipo de backup, si es diferencial o completo. Esta opción también es OPCIONAL y por defecto equivale a FULL. Para el backup diferencial se toma como punto de referencia el último backup FULL que se ha hecho. Se puede consultar cuándo se ha hecho con esta query:
select top 1 
database_name
,  backup_start_date
,  backup_finish_date 
from    msdb.dbo.backupset 
where   database_name='database_name'
and     type = 'D' 
order by backup_start_date desc;

Este export no es instantáneo y va a depender sobre todo del tamaño de la BD; para ver su evolución, lo hacemos con esta query:

exec msdb.dbo.rds_task_status @db_name='database_name';
 
Si quisiéramos restaurar la base de datos, la query sería


exec msdb.dbo.rds_restore_database
@restore_db_name=’database_name';
@s3_arn_to_restore_from='arn:aws:s3:::bucket_name/file_name_and_extension';


Bien, y hasta aquí la parte de AWS; en el siguiente post os explico cómo lo hago yo para importar el export en un SQL Server.



Gracias!

martes, 12 de diciembre de 2017

Error común: "Too many open files", en Tomcat o PHP


Si Tomcat os devuelve un error HTTP 500 y en el 'catalina.out' encontráis algo de este tipo

[] org.apache.tomcat.util.net.JIoEndpoint$Acceptor run SEVERE: Socket accept failed
java.net.SocketException: Too many open files

es que tenéis un problema de ficheros abiertos; con

> ulimit -a

puedes ver tu configuración actual; repasa la variable "open files" que te da cuántos ficheros abiertos puede haber por proceso. Puedes modificarla con

> ulimit -n #

donde # es el nuevo valor; prueba con 4096 y reinicia el tomcat para que coja el cambio de esta variable de sistema

Para controlar cuántos ficheros tiene un proceso abierto, lo puedes hacer con  

> lsof -l | grep tomcat

Este tipo de fallo es aplicable a cualquier otra aplicación, no sólo a tomcat; también PHP requiere abrir muchos ficheros y puede  arrojar un error similar. Tenlo en cuenta cuando una aplicación se pare de repente después de rato funcionando bien.



Gracias!


lunes, 30 de octubre de 2017

viernes, 1 de septiembre de 2017

Compilar y configurar PHP-FPM 5.6.30 para que escuche en un puerto sobre Debian 8

Aprovecho que he tenido que compilar de nuevo PHP para poder utilizarlo con nGinx, y os dejo mi receta


> mkdir /opt/source
> mkdir -p /opt/php-5.6
> cd /opt/source # Bajo y descomprimo el código fuente en este directorio
> get http://es1.php.net/get/php-5.6.30.tar.gz
> tar -xzvf php-5.6.30.tar.gz
> apt-get install build-essential
> apt-get install libcurl4-openssl-dev pkg-config
> apt-get install libbz2-dev
> apt-get install libjpeg62 libjpeg62-dev
> apt-get install libpng12-dev
> apt-get install libfreetype6-dev
> apt-get update && apt-get install -y libc-client-dev libkrb5-dev
> mkdir /usr/lib64/
> ln -s /usr/lib/libc-client.a /usr/lib64/libc-client.a
> apt-get install make
> cd php-5.6.30
> ./configure \
--prefix=/opt/php-5.6 \
--with-zlib-dir \
--with-freetype-dir \
--enable-mbstring \
--with-libxml-dir=/usr \
--enable-soap \
--enable-calendar \
--with-curl \
--with-mcrypt \
--with-zlib \
--with-gd \
--disable-rpath \
--enable-inline-optimization \
--with-bz2 \
--with-zlib \
--enable-sockets \
--enable-sysvsem \
--enable-sysvshm \
--enable-pcntl \
--enable-mbregex \
--with-mhash \
--enable-zip \
--with-pcre-regex \
--with-mysql \
--with-pdo-mysql \
--with-mysqli \
--with-png-dir=/usr \
--enable-gd-native-ttf \
--with-openssl \
--with-libdir=lib64 \
--enable-ftp \
--with-imap \
--with-imap-ssl \
--with-kerberos \
--with-gettext \
--with-gd \
--with-jpeg-dir=/usr/lib/ \
--enable-fpm \
--with-fpm-user=www-data \
--with-fpm-group=www-data \
--enable-intl \
--with-xsl \
--with-pear
> make
> make install

# Configuro PHP-fpm

> cp /opt/php-5.6/etc/php-fpm.conf.default /opt/php-5.6/etc/php-fpm.conf
> cp /opt/source/php-5.6.30/php.ini-production /opt/php-5.6/lib/php.ini
> vi /opt/php-5.6/etc/php-fpm.conf
[...]
pid = run/php-fpm.pid
[...]
user = www-data
group = www-data
[...]
listen = 127.0.0.1:9001
[...]
#include=/opt/php-5.6/etc/pool.d/*.conf
[...]
[www-PHP56]
> cp /opt/source/php-5.6.30/sapi/fpm/init.d.php-fpm /etc/init.d/php5.6-fpm
> chmod 755 /etc/init.d/php5.6-fpm
> /etc/init.d/php5.6-fpm start

Solo faltaría configurar nGinx para que envíe las peticiones PHP a este puerto. También se podría configurar por socket.

sábado, 12 de agosto de 2017

Compilar PHP 5.6.29 con Apache2.2.16 sobre Debian 8

Os dejo mi receta para compilar PHP 5.6.29 para Apache2.2; no tiene pérdida!


# Preparo apache2 ya instalado para poder compilar PHP

> cd /root
> wget http://archive.debian.org/debian/pool/main/a/apache2/apache2-threaded-dev_2.2.16-6+squeeze15_i386.deb  ## Busca tu paquete según la distribución que utilices y tu versión de Apache
> apt-get install libaprutil1-dev
> dpkg -i apache2-threaded-dev_2.2.16-6+squeeze15_i386.deb
> updatedb
> locate apxs     ## Comprueba donde ha instalado el sistema las apxs, las necesitarás en el primer paso de la compilación del PHP; en mi caso será /usr/bin/apxs2, pero si el directorio es otro no pasa nada

# PHP

> mkdir /opt/source
> mkdir -p /opt/php-5.6
> cd /opt/source # Bajo y descomprimo el código fuente en este directorio.
> apt-get install build-essential
> apt-get install libfcgi-dev libfcgi0ldbl libjpeg62-dbg libmcrypt-dev libssl-dev libc-client2007e libc-client2007e-dev
> ln -s /usr/lib/libc-client.a /usr/lib64/libc-client.a
> cd php-5.6.29
> ./configure \
--with-apxs2=/usr/bin/apxs2 \ # Cambia aquí la localización de apxs
--prefix=/opt/php-5.6 \
--with-pdo-pgsql \
--with-zlib-dir \
--with-freetype-dir \
--enable-mbstring \
--with-libxml-dir=/usr \
--enable-soap \
--enable-calendar \
--with-curl \
--with-mcrypt \
--with-zlib \
--with-gd \
--with-pgsql \
--disable-rpath \
--enable-inline-optimization \
--with-bz2 \
--with-zlib \
--enable-sockets \
--enable-sysvsem \
--enable-sysvshm \
--enable-pcntl \
--enable-mbregex \
--with-mhash \
--enable-zip \
--with-pcre-regex \
--with-mysql \
--with-pdo-mysql \
--with-mysqli \
--with-png-dir=/usr \
--enable-gd-native-ttf \
--with-openssl \
--with-libdir=lib64 \
--enable-ftp \
--with-imap \
--with-imap-ssl \
--with-kerberos \
--with-gettext \
--with-gd \
--with-jpeg-dir=/usr/lib/ \
--with-pear
> make
> make install

# Configuro PHP
# Por último, configurar Apache2 para que trabaje con PHP5.6

> cat /etc/apache2/mods-available/php5.load
LoadModule php5_module /usr/lib/apache2/modules/libphp5.so