SSHcomoRoot

Miércoles, 26 de Octubre de 2016

Ejecución de comandos remotos como root mediante SSH

En algunas situaciones es necesario ejecutar de forma remota comandos como root por SSH. Aunque es posible activar el acceso como root por SSH de forma remota, no es recomendable hacerlo por motivos de seguridad. Para mejorar esta seguridad podemos hacer que el acceso como root solo esté permitido autenticándose con clave pública (no mediante password).

Sin embargo, todavía podemos mejorar un poco más la seguridad, si restringimos los comandos que se pueden ejecutar de forma remota. Para ello, SSHD dispone de la opción forced-commands-only. Con esta opción activa, la autenticación solo se puede realizar mediante clave pública y además, para cada pública se asigna el único comando que se puede ejecutar con ella. Tendremos que crear tantas claves públicas como comandos diferentes queramos ejecutar, lo que puede ser un problema si el número de comandos es elevado.

Para utilizar esta opción procederemos de la siguiente forma:

  • En los clientes crearemos tantos pares de claves públicas/privadas como comandos diferentes vayamos a ejecutar. Lo podemos hacer con le comando ssh-keygen -t rsa -b 2048 (el algoritmo a utilizar en las claves y al longitud de las mismas las fijaremos según nuestras políticas). Cada una de estas claves deberá guardarse en un fichero diferente.
  • En el servidor, en la configuración de SSH (/etc/ssh/sshd_config) configuraremos el parámetro PermitRootLogin con el valor forced-commands-only y reiniciaremos el servicio sshd.
PermitRootLogin forced-commands-only
  • En el servidor, en el fichero de autorización de claves (/root/.ssh/authorized_keys) añadiremos una línea por comando con el siguiente formato:
from="%IP_CLIENTE%",command="%COMANDO%" ssh-rsa %CLAVE_PUBLICA%

Con esta línea, le decimos al servidor, que cuando un cliente se conecte desde %IP_CLIENTE% identificándose con el par de claves cuya clave publica es %CLAVE_PUBLICA% se ejecuta el comando %COMANDO% como root y se finalice la conexión.

  • Para ejecutar el comando desde el cliente escribiremos simplemente: ssh root@servidor -i %CLAVE_PRIVADA%. Mediante el parámetro -i hemos de especificar el fichero que contiene la clave privada correspondiente al fichero que queremos ejecutar.

Linux ,

Visualizar variables entorno con Apache y SSI

Lunes, 18 de Julio de 2016

A veces nos surge la necesidad de visualizar las variables de entorno que tenemos definidas dentro de una página en Apache. Una forma de hacerlo en PHP es utilizar la función phpinfo, pero si no disponemos de PHP (o no queremos instalar el soporte para este lenguaje), pero si de SSI (Server Side Includes mediante el modulo mod_include) podemos crearnos una página variables.shtml con el siguiente código:

<pre>
<!--#printenv -->
</pre>

Al acceder a esta página desde el navegador se nos mostrarán todas las variables de entorno a las que tengamos acceso.

Apache , , ,

Modulo OCI8 para PHP 5.5 Software Collections en Red Hat 7

Lunes, 22 de Febrero de 2016

En el servidor web que administro, ha surgido la necesidad de actualizar a PHP 5.5 para dar soporte a las nuevas versiones de productos como phpMyAdmin, Piwik y similares.

Para facilitar las tareas de mantenimiento del servidor utilizamos la versión de PHP distribuida con el sistema operativo Red Hat. En este caso, hemos decidido aprovechar esta actualización para también actualizar el SO a Red Hat 7 Enterprise Linux (en adelante RH7).

Sin embargo, la versión de PHP que viene con RH7 es la 5.4 y no nos sirve. Para resolver este problema Red Hat proporciona las Software Collections que incluyen la versión 5.5 y 5.6 de PHP. De momento vamos a optar por actualizar a la versión 5.5, ya que actualmente tenemos PHP 5.3 y el cambio a la 5.5 va a ser más sencillo que actualizar directamente a la 5.6 (más adelante ya abordaremos la actualización a PHP 5.6).

Aunque con las Software Collections se incluyen muchos módulos de PHP, no están todos los que utilizamos, en este caso concreto no está el modulo OCI8 para acceder a BBDD Oracle.

Por este motivo vamos a generarnos un nuevo paquete RPM compatible con el PHP 5.5 de las Software Collections que nos añada el modulo OCI8.

Este paquete lo vamos a generar en un servidor con RH7 que tenga la herramienta rpmbuild instalada.

En primer lugar hemos de instalarnos el Instant Client de Oracle para Linux. Necesitamos los paquetes RPM *-devel y *-basic de este cliente. He utilizado la versión 12 de Oracle y estos paquetes se pueden descargar desde la web de Oracle.

Ahora buscamos un RPM source del modulo OCI8 para PHP 5.5. Oracle nos proporciona uno para Red Hat 6 en la dirección: https://oss.oracle.com/projects/php/files/EL6/. Nos lo descargamos y lo descomprimimos en /root/rpmbuild/SOURCES con el siguiente comando:

# rpm2cpio php55-oci8-5.5.10-2.el6.src.rpm | cpio -idmv

Este paquete utiliza la versión 2.0.8 del OCI8 para PHP y existe la 2.0.10. Descargamos esta última versión y ubicamos el fichero en /root/rpmbuild/SOURCES.

Ahora hemos de adaptar el fichero SPEC (php55oci8.spec)  para generar los RPMs que necesitamos.  Modificamos lo siguiente:

1,2d0
< %{?scl:%scl_package php-oci8}
<
4c2
< # Builds the latest DTrace disabled PHP OCI8 extension on top of PHP 5.5
---
> # Builds the latest DTrace enabled PHP OCI8 extension on top of PHP 5.5
7,8c5,6
< %global apiver %{php55_php_core_api}
< %global zendver %{php55_php_zend_api}
---
> %global apiver 20121113
> %global zendver 20121212
12c10
< %define oci8peclver 2.0.10
---
> %define oci8peclver 2.0.8
24c22
< Name: %{?scl_prefix}php-oci8
---
> Name: php55-oci8
26,27c24,25
< Version: 5.5.21
< Release: 1%{?dist}
---
> Version: 5.5.10
> Release: 2%{?dist}
44a43
> Obsoletes: php53-oci8-11gR1 php53-oci8-12cR1
48c47
< Requires: %{?scl_prefix}php-common >= %{version}, oracle-instantclient12.1-basic >= %{oci12cR1ver}
---
> Requires: php55-common >= %{version}, oracle-instantclient12.1-basic >= %{oci12cR1ver}
50,53d48
<
< Requires: %{?scl_prefix}php(zend-abi) = %{php55_php_zend_api}
< Requires: %{?scl_prefix}php(api) = %{php55_php_core_api}
<
55c50,51
< BuildRequires: %{?scl_prefix}php-devel >= %{version}
---
> BuildRequires: dtrace-utils >= 0.4.0-5
> BuildRequires: php55-devel >= %{version}
57c53
< Provides: %{?scl_prefix}php-oci
---
> Provides: php55_database, php55-oci, mod_php = %{version}-%{phprelease}
68d63
< %setup -q -c -T -n %{pkg_name}-%{version}
71a67,82
> # Safety check for API version change.
> vapi=`phpize -v | sed -n '/PHP Api Version:/{s/.* //;p}'`
> if test "x${vapi}" != "x%{apiver}"; then
> : Error: Upstream API version is now ${vapi}, expecting %{apiver}.
> : Update the apiver macro and rebuild.
> exit 1
> fi
>
> # Safety check for Zend API version change.
> vzend=`phpize -v | sed -n '/Zend Module Api No:/{s/^[^0-9]*//;p;}'`
> if test "x${vzend}" != "x%{zendver}"; then
> : Error: Upstream Zend module ABI version is now ${vzend}, expecting %{zendver}.
> : Update the zendver macro and rebuild.
> exit 1
> fi
>
74c85
< %{_bindir}/phpize
---
> phpize
80c91
< PHP_DTRACE=no
---
> PHP_DTRACE=yes
86c97
< %configure --with-php-config=%{_bindir}/php-config --with-oci8=shared,instantclient,/usr/lib/oracle/$VER/client64/lib
---
> %configure --with-oci8=shared,instantclient,/usr/lib/oracle/$VER/client64/lib
164,168d174
< * Fri Feb 19 2016 David Fernandez <david.fernandez@ehu.eus> 5.5.21
< - Use Red Hat Enterprise Linux 7
< - Use PHP 5.5.21
< - Use OCI8 2.0.10
<
209c215
< * Sun Nov 1 2009 Christopher Jones <christopher.jones@oracle.com> 5.2.11
---
> * Mon Nov 1 2009 Christopher Jones <christopher.jones@oracle.com> 5.2.11
215c221
< * Tue Apr 28 2009 Christopher Jones <christopher.jones@oracle.com> 5.2.9
---
> * Wed Apr 28 2009 Christopher Jones <christopher.jones@oracle.com> 5.2.9
227,228c233,235
< * Fri Aug 8 2008 Srinivas Maturi <srinivas.maturi@oracle.com> 5.1.6-20.el5_2.1
< - Update BuildRequires for oracle-instantclient-devel and Conflicts for oracle-instantclient-basic
---
> * Tue Aug 08 2008 Srinivas Maturi <srinivas.maturi@oracle.com> 5.1.6-20.el5_2.1
> - Update BuildRequires for oracle-instantclient-devel and Conflicts for
> oracle-instantclient-basic
230c237
< * Tue Aug 5 2008 Srinivas Maturi <srinivas.maturi@oracle.com> 5.1.6-20.el5_2.1
---
> * Tue Aug 05 2008 Srinivas Maturi <srinivas.maturi@oracle.com> 5.1.6-20.el5_2.1
233c240
< * Mon Jul 21 2008 Srinivas Maturi <srinivas.maturi@oracle.com> 5.1.6-20.el5_2.1
---
> * Fri Jul 21 2008 Srinivas Maturi <srinivas.maturi@oracle.com> 5.1.6-20.el5_2.1
237c244,245
< - Update rpm name, add libaio as runtime dependency, remove code to run tests at build time
---
> - Update rpm name, add libaio as runtime dependency, remove code to run
> tests at build time

Una vez que ya tenemos el fichero spec, generamos los ficheros RPMs con el siguiente comando:

# rpmbuild -ba php55oci8.spec --define "scl php55"

Si todo ha ido bien, los RPMs estarán en /root/rpmbuild/RPMS y ya los podremos instalar con YUM.

Linux , , , , , ,

Generar configuración SSL servidor web

Miércoles, 17 de Junio de 2015

Ultimamente están apareciendo vulnerabilidades de SSL y además algunos de los algoritmos utilizados para la comunicación están siendo declarados inseguros, por lo que hay que revisar la configuración de los servidores web con SSL para evitar estos problema.

En mi opinión la configuración de SSL es complicada sobre todo si queremos afinarla en lo relativo a que algoritmos de cifrado permitir y cuales no. Para ayudarnos en este labor podemos usar el Mozilla SSL Configuration Generator

Servidor web, ssl , ,

Yum Shell

Lunes, 10 de Noviembre de 2014

En algunos casos nos puede surgir la necesidad de sustituir un paquete por otro que proporcione la misma funcionalidad. Para complicar el asunto, se da la circunstancia de que no es posible tener instalados los dos paquetes simultáneamente (porque generan un conflicto al instalar el segundo de ellos) y además no es práctico desinstalar uno para instalar el otro, ya que es un paquete del que dependen muchos otros y la desintalación de ese paquete implicaría la desintalación de muchos otros. Este es el caso que se da al intentar sustituir el paquete rsyslog por el nuevo rsyslog7 en un Red Hat Enterprise Linux 6.

Para resolver esta situación podemos utilizar el Yum Shell, con el que podremos crear una transacción básica Yum que nos permitirá sustituir el paquete deseado sin modificar los otros.

La secuencia de comandos que utilizaríamos para sustituir el paquete rsyslog por rsyslog7 con el yum shell sería la siguiente:

# yum shell
> remove rsyslog
> install rsyslog
> run
> exit
# service rsyslog start
# chkconfig rsyslog on

Linux , ,

Monitor estado Nagios

Jueves, 22 de Mayo de 2014

Los serviores que administro están monitorizados mediante Nagios. Hasta ahora para ver el estado de los servidores me conectaba directamente a la página de Nagios o utilizaba alguno de los plugins existentes para los navegadores. Estas dos opciones, requerían tener en ejecución un navegador, lo que en ocasiones no era muy práctico.

El otro día, me encontré con un software que muestra el estado de Nagios, pero que directamente se integra en el Escritorio del SO, sin necesidad de utilizar un navegador. Su nombre es: Nagstamon. Llevo unos días probandolo y de momento funciona muy bien. Además hay versiones tanto para Windows como para Linux y es bastante configurable (donde se visualizará, como avisará, filtros para descartar alertas no importantes,…)

 

Sin clasificar , , ,

ConfiguracionDefectoJava

Martes, 30 de Abril de 2013

Conocer los parámetros por defecto de Java

Para conocer los parámetros por defecto con los que nos arrancará la máquina Java si no indicamos nada podemos usar:

# java -XX:+PrintFlagsFinal

java ,

formatolsrh6

Jueves, 4 de Abril de 2013

Cambios en el formato largo del comando ls en Red Hat 6

Al revisar los contenidos de un directorio en un servidor con Red Hat 6, me ha llamado la atención que en algunos ficheros o directorios, a continuación de los permisos, en algunos de ellos aparecía un punto (carácter ‘.’).

# ls -l /etc/sysconfig

-rw-r–r–  1 root root 2440 Dec  6 17:11 raid-check
-rw-r–r–. 1 root root  551 Mar 24  2010 readahead
-rw-r–r–  1 root root  659 Mar  7 16:37 readonly-root
drwxr-xr-x. 4 root root 4096 Feb 26 08:28 rhn
-rw-r—–  1 root root   41 Dec  2  2011 rngd
-rw-r–r–. 1 root root  196 Apr  4 10:08 rsyslog

En anteriores versiones del SO, no había visto este carácter. Revisando documentación por internet he visto que después de los permisos existe un carácter que específica métodos alternativos de acceso. Cuando este carácter es imprimible entonces está definido alguno de estos métodos.  En el caso de que este carácter sea ‘.’ indica que el fichero tiene establecido un contexto de seguridad SELinux. Otro carácter que suele aparecer es ‘+’ para indicar que el fichero tiene otro método de acceso como una ACL,…

http://www.gnu.org/software/coreutils/manual/coreutils.html#ls-invocation

Linux ,

GenerarManualmenteFicherosTraducciones

Martes, 24 de Julio de 2012

Generar manualmente ficheros de traducciones .mo a partir del .po correspondiente

Las herramientas de modificación de ficheros .po generan de forma automática los ficheros .mo correspondiente. Sin embargo, en algunos casos nos puede interesar modificar los ficheros .po con un editor de textos normal y luego para generar el fichero .mo correspondiente podemos usar el comando:

# msgfmt -o fichero.mo fichero.po

Sin clasificar

CalcularSemanaMes

Martes, 17 de Julio de 2012

Calcular el número de semana dentro del mes en Bash

Para calcular el número de semana dentro de un mes (por ejemplo para saber si un día es el tercer martes de un determinado mes) podemos usar el siguiente comando:

# cal -m $MES $YEAR | sed -n "3,$ p" | sed -n "/$DAY/{=;q;}"

Este comando calcula partiendo de la base de que el primer día de la semana es lunes. Para calcular partiendo del domingo como primer día de la semana, quitaríamos el flag “-m” del comando cal o añadiríamos el flag “-s”.

Linux ,