lunes, 4 de diciembre de 2017

Cron; el programador de tareas de Linux / UNIX

Muchos administradores aún desconocen la herramienta cron, es el programador de tareas del que disponemos en todas las distribuciones de Linux, incluidas las distribuciones propietarias.

Suele ubicarse en la ruta /etc/crontab y podemos editarlo con cualquier editor de textos, normalmente usaremos vi que es la herramienta por excelencia de todos los administradores de sistemas.

En el siguiente ejemplo, vamos a programar una tarea usando el comando crontab –e, que nos permitirá editar la tabla de tareas cron, y añadiremos una línea para el sistema se sincronice a diario con un servidor NPT, como por ejemplo hora.roa.es.

Bien, una vez dentro de la lista de entradas de tareas, añadimos la siguiente línea:

1 0 * * * root ntpdate hora.roa.es >> /var/log/ntp.log

Con esta tarea, el sistema sincroniza con el servidor horario NTP a las 00:01 horas, todos los días de la semana y del mes.

A continuación, esta tabla muestra el significada de cada parámetro en la línea:

.----- Minuto [0 - 59]
|.---- Hora [0 - 23]
||.--- Día del mes [1 - 31]
|||.-- Mes [1 - 12] (o jan, feb, mar, apr ...)
||||.- Día de la semana [0 - 7] (sun, mon, tue, wed, thu, fri, sat,sun)
|||||
***** [usuario] [comando] [parametros]

lunes, 20 de noviembre de 2017

Cerrar sesiones en Oracle

El primer paso es identificar la sesión que queremos matar:

SET LINESIZE 100
COLUMN spid FORMAT A10
COLUMN username FORMAT A10
COLUMN program FORMAT A45

SELECT s.inst_id,
       s.sid,
       s.serial#,
       p.spid,
       s.username,
       s.program
FROM   gv$session s
       JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE  s.type != 'BACKGROUND';

   INST_ID        SID
   SERIAL# SPID       USERNAME   PROGRAM
---------- ---------- ---------- ---------- ---------- ---------------------------------------------
         1         30         15 3859       TEST       sqlplus@oel5-11gr2.localdomain (TNS V1-V3)
         1         23        287 3834       SYS        sqlplus@oel5-11gr2.localdomain (TNS V1-V3)
         1         40        387 4663                  oracle@oel5-11gr2.localdomain (J000)
         1         38        125 4665                  oracle@oel5-11gr2.localdomain (J001)



Los valores SID y SERIAL# son los que se utilizaran en los comandos que explicamos más delante.

 ALTER SYSTEM KILL SESSION

La sintaxis básica para matar una sesión es la siguiente:

SQL> ALTER SYSTEM KILL SESSION 'sid,serial#';
En un ambiente RAC, opcionalmente se puede añadir  el identificador de la instancia INST_ID, lo obtenemos de la vista GV$SESSION view. Este permite matar una sesión desde otro de los nodos de RAC.

SQL> ALTER SYSTEM KILL SESSION 'sid,serial,#@inst_id';

El comando KILL SESSION no mata la sesión, simplemente le indica a la sesión que debe matarse ella misma. En algunas situaciones como en la espera de una respuesta de una base de datos remota o cuando se esta haciendo un roll back a una transacción, la sesión no se mata a si misma inmediatamente, espera a que termine la operación que está realizando. En estos casos la sesión adquiere el status de “marked for kill”, y se mata lo antes posible

Además de la syntaxix  descrita anteriormente, se puede añadir la clausula IMMEDIATE.

SQL> ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

Esto no afecta al trabajo que hace el comando, pero devuelve el control a la sesión inmediatamente, en vez de esperar la confirmación de que se ha matado la sesión.

Si la sesión marcada persiste demasiado en el tiempo se puede intentar matar el proceso a nivel de sistema operativo, antes de hacer esto es conveniente comprobar que la sesión no está haciendo rollback. Podemos comprobar esto con el script (session_undo.sql), lo tenéis en la página de scripts. Si el valor de USED_UREC decrece para la sesión en cuestión es mejor dejar que termine el rollback antes de matar la sesión a nivel de sistema operativo.

ALTER SYSTEM DISCONNECT SESSION

Oracle 11g introduce la sintaxis ALTER SYSTEM DISCONNECT SESSION  un nuevo método de matar una sesion Oracle.  Lo que hace este comando es matar el proceso de servidor dedicado ( o circuito virtual cuando se utilizan los Shared Sever), lo que es equivalente a matar el proceso desde el sistema operativo. La sintaxis básica es similar a la del comando KILL SESSION más la clausula POST_TRANSACTION.

SQL> ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' POST_TRANSACTION;
SQL> ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' IMMEDIATE;

La clausula POST_TRANSACTION espera a que la transacción se complete antes de desconectar la sesión.

Matar una sesión en windows

C:> orakill ORACLE_SID spid

Matar una sesión en Unix

% kill spid

Si después de unos minutos no ha muerto utilizar

% kill -9 spid

Para verificar que el spid coincide con el proceso del sistema operativo:

% ps -ef | grep ora

jueves, 10 de agosto de 2017

Instalación y configuración de un cliente NTP

Copiamos a la máquina los paquetes necesarios.

Instalamos gcc, g++ (junto con sus dependencias), make y las librerías necesarias para poder compilar e instalar el software:

Realizamos una instalación típica:

# tar -xvzf [paquete_ntp]
# cd [directorio_descomprimido]
# ./configure --prefix=[ruta_ntp_instalado]
# make
# make install

Una vez instalado realizamos estos dos pequeños pasos:

Tras instalarlo, creamos un pequeño script que ejecute el comando  ntpdate -u [servidorNTP], el cual se conecta con un servidor NTP saltándose las restricciones de cortafuegos.

Cogemos el script que hemos creado, y lo colocamos en el cron para que se ejecute periódicamente y así mantener el reloj actualizado cada cierto tiempo (el que hayamos definido en el cron).

** Más información en http://bulma.net/body.phtml?nIdNoticia=408 **

1) Hemos creado el siguiente script, al que lo hemos llamado ntpCron:

#!/bin/bash

/opt/ntp/bin/ntpdate -u 129.132.2.21

Esta ip que hemos puesto es la del servidor swisstime.ethz.ch, pero tenemos que poner la IP porque no tenemos los DNS bien configurados.

A continuación ponemos una lista de posibles servidores:

# ntp.metas.ch (193.5.216.14)
# swisstime.ethz.ch (129.132.2.21)
# ntp0.fau.de (131.188.3.220)
# ptbtime1.ptb.de (192.53.103.103)
# hora.roa.es (150.214.94.5, este último es el más aconsejable)


2) Hay dos posibilidades:

- Poner el script en la carpeta /etc/cron.hourly, con lo que se ejecutará cada hora.

- Incluir una llamada al script en el archivo /etc/crontab para que el script se ejecute cuando se lo hayamos especificado. Como ayuda, una linea del archivo crontab tiene el siguiente formato:

1 2 3 4 5 /ruta/script

Donde cada número se sustituirá por el valor que corresponda:

1) Minutos.
2) Horas.
3) Días del mes (de 1 a 31).
4) Meses.
5) Días de la semana (de 1 a 7 ó de 0 a 6, funciona igual).

miércoles, 2 de agosto de 2017

Instalar componentes de LAMP individualmente

Usaremos las siguientes versiones de los componentes, aunque podemos usar veriones superiores si lo deseamos:
 
Nucleo Linux 2.2.x 
MySql 5.x 
PHP 5.X

Vamos a instalarlo todo en la ruta /usr/local , ya que MySql se instala allí por defecto.

Ponemos los archivos comprimidos de los componentes en /usr/local, y nos situamos en dicha ruta.

Comenzamos:

Instalamos Apache

# tar -xvzf [paquete apache] 
# cd [paquete apache]
#./configure --prefix=/opt/apache2 --enable-mods-shared=all
# make
# make install

Instalamos MySQL

    Creamos el usuario y el grupo mysql:

        # groupadd mysql
        # useradd -g mysql mysql
   
    Para cambiar de usuario usamos el siguiente comando:

        # su - [nombre_usuario]

        Copiamos el tar.gz a /usr/local y lo descomprimimos.
   
        tar -xvzf [archivo_distribucion_mysql].tar.gz
   
    Creamos un enlace simbólico:
   
        ln -s /usr/local/[archivo_distribucion_mysql] mysql
   
    Ejecutamos el script mysql_install_db ubicado en la carpeta scripts.
   
    Iniciamos la base de datos con:

        #/usr/local/mysql/bin/safe_mysqld &

        *** Hay que hacerlo con el usuario mysql ***

Inicializamos la contraseña del root de base de datos. Hay dos maneras, o modificando los privilegios de la tabla "user" de la base de datos, o mediante el comando "mysqladmin".

    Mediante BBDD:

        # mysql -u root
        mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpwd');
        mysql> SET PASSWORD FOR 'root'@'%' = PASSWORD('newpwd');


    Con mysqladmin:

        # mysqladmin -u root password "newpwd"
        # mysqladmin -u root -h host_name password "newpwd"


Añadir nuevo usuario: primero tenemos que crearlo en el sistema, y luego le concedemos los permisos de administrador de la siguiente manera:

Entramos en la instancia "mysql" (instancia por defecto) con el usuario root, y ejecutamos los siguientes comandos:

        mysql> GRANT ALL PRIVILEGES ON *.* TO 'nuevo_usuario'@'localhost'  IDENTIFIED BY
        'pass_del_nuevo_usuario' WITH GRANT OPTION;
        mysql> GRANT ALL PRIVILEGES ON *.* TO 'nuevo_usuario'@'%'  IDENTIFIED BY 
        'pass_nuevo_usuario' WITH GRANT OPTION;
        mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';
        mysql> GRANT USAGE ON *.* TO 'dummy'@'localhost';

    Así ya nos podremos conectar a la base de datos en el nuevo_usuario.

    Poner mysql como servicio:

Copiamos el script "mysql.server" a /etc/init.d, y lo colocamos en los niveles de arranque que queramos.

Instalamos PHP, compilándolo con los parámetros especificados:

    # tar -xvzf [paquete php]
    # cd [paquete php]
    # ./configure --prefix=/opt/php5.5.26 --with-apxs2=/opt/apache2/bin/apxs --enable-magic-quotes 
    --with-zlib --enable-dba --with-gdbm --with-gd --enable-ftp --with-jpeg-dir --enable-gd-native-ttf 
    --enable-mbstring --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config 
    --enable-wddx
    # make
    # make install

viernes, 21 de julio de 2017

Reiniciar ORACLE remotamente de forma correcta

Seguramente alguna vez nos hemos encontrado que a la hora de reiniciar el servicio de ORACLE (10G en adelante), este no "levanta" correctamente, o bien nos da algún error.

Este problema suele ser debido a que no estamos usando el usuario correcto de ORACLE, o bien a que no estamos haciendo los pasos en el orden correcto.

Os dejo unas notas orientativas que pueden ayudar:

Conectarse a la maquina por ssh (no se puede usar el usuario root): 

usuario:XXXXXX
passwd: XXXXXX 

Reiniciar el listener:

Las variables de entorno deberan de estar ya definidas:

lsnrctl start LISTENER (El nombre de listener y el puerto de escucha, lo puedes ver en listener.ora

Reiniciar sólo la base de datos (en caso extremos):

Escribimos sqlplus "/as sysdba" una vez iniciada la sesion en SSH.

startup 

Despues de salir de sqlplus (quit), levantar el entorno web de administracion de ORACLE.

emctl start dbconsole (Levanta entorno web de admin).

Para reiniciarlo, primero hay que parar la BD:

shutdown immediate

Luego para iniciar de nuevo la base de datos:

startup

miércoles, 28 de junio de 2017

Cómo generar un nuevo archivo sendmail.cf

  1. Conviértase en administrador.
    $ su root
    
  2. Detenga sendmail.
    # svcadm disable -t network/smtp:sendmail
    
  3. Realice una copia de los archivos de configuración que desea cambiar.
    # cd /etc/mail/cf/cf
    # cp sendmail.mc myhost.mc
    mi_host
    Seleccione un nuevo nombre para el archivo .mc.
  4. Edite los nuevos archivos de configuración (por ejemplo, myhost.mc), según sea necesario. Por ejemplo, agregue la siguiente línea de comandos para habilitar el enmascaramiento de dominios.
    # cat myhost.mc
    ..
    MASQUERADE_AS(`host.domain')
    host.domain
    Utilice el nombre de host y el nombre de dominio deseados.
    En este ejemplo, MASQUERADE_AS provoca que el correo enviado se etiquete como procedente de host.domain, en lugar de $j.
  5. Genere el archivo de configuración con m4.
    # make myhost.cf
    
  6. Pruebe el nuevo archivo de configuración y utilice la opción -C para especificar el nuevo archivo.
    # /usr/lib/sendmail -C myhost.cf -v testaddr </dev/null
    
    Cuando este comando muestra mensajes, envía un mensaje a testaddr. Sólo el correo saliente se puede probar sin reiniciar el servicio sendmail en el sistema.
  7. Instale el nuevo archivo de configuración después de realizar una copia del original.
    # cp /etc/mail/sendmail.cf /etc/mail/sendmail.cf.save
    # cp myhost.cf /etc/mail/sendmail.cf
    
  8. Reinicie el servicio sendmail.
    # svcadm enable network/smtp:sendmail

miércoles, 14 de junio de 2017

Codificación UTF8 para Jboss

Seguramente, en nuestra trabajo más de una vez nos hemos encontrado con el problema de la codificación de caracteres. Bien en sesiones SSH, en archivos de configuración, en la presentación de las mismas aplicaciones.

A continuación expongo unas notas para corregir esto en el caso del servidor de aplicaciones Jboss.

    En el server.xml de jbossweb.sar/, añadir al conector "8080":
   
        URIEncoding="UTF-8"
       
    En las opciones de arranque de run.conf, añadir en el JAVA_OPTS:
   

        Dfile.encoding=UTF-8
       
    En el components.xml de la aplicación:
   
        <web:character-encoding-filter encoding="UTF-8" override-client="true" url-pattern="*.seam" />

jueves, 1 de junio de 2017

Entorno gráfico mínimo en Linux


Son necesarios los siguientes paquetes mínimos:

1) x-window-system
2) xorg

A partir de esto, debemos añadir diferentes paquetes para que el entorno gráfico pueda funcionar correctamente:

3) Gestor de ventanas  (Window Manager).
  • OpenBox -> Ligero pero difícil de configurar
  • IceWM
  • FluxBox
  • FVWM-Crystal
  • XFCE -> Más pesado, pero más simple de configurar. Tiene una variante para Ubuntu: Xubuntu, el cual instala un entorno gráfico prácticamente completo.

4) Gestor de login: Para poder loggearse en el entorno gráfico.
  • GDM -> Muy pesado
  • KDM -> También muy pesado.
  • XDM -> El más básico. Feo de estética, pero igual de útil que los anteriores.

5) Navegadores (Browsers).
  • Firefox
  • Dillo
6) Gestores de archivos.
  • Nautilus -> Propio de Gnome
  • Konqueror -> El de KDE.
  • Thunar -> El que trae por defecto Xubuntu. y los basados en XFCE
  • XFE -> Parecido al Explorador de Windows.

7) Gestor de Paquetes: Sustitutos gráficos de apt-get o aptitude para gestionar software.
  • Synaptic -> El más popular y potente.

martes, 14 de marzo de 2017

Seguridad en IP Tables (Linux) - Operaciones con una regla simple


Esta es la base del filtado de paquetes, la manipulación de reglas. Normalmente utilizarás los comandos de añadir (-A) y eliminar (-D), las otras (-I para insertar y -R para reemplazar) son extensiones de estos conceptos.

Cada regla especifica un conjunto de condiciones que un paquete debe cumplir, y lo que haremos si cumple dichas condiciones (efectuaremos una 'acción'). Por ejemplo, puede que quieras hacer DROP de los paquetes ICMP provinientes de la dirección 127.0.0.1. En este caso definiremos el protocolo como ICMP, la dirección de origen como 127.0.0.1 y la acción será DROP.

127.0.0.1 es el interface 'loopback' que tendrá en su máquina incluso si no dispone de una conexión real a la red. Puede hacer un 'ping' para generar paquetes dichos paquetes (un ping simplemente envia paquetes ICMP del tipo 8 (petición de eco) que todos los hosts operativos deberán responder con un paquete ICMP de tipo 0 (respuesta del eco). Esto hace ping muy útil para el testeo.

    # ping -c 1 127.0.0.1
    PING 127.0.0.1 (127.0.0.1): 56 data bytes
    64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms

    --- 127.0.0.1 ping statistics ---
    1 packets transmitted, 1 packets received, 0% packet loss
    round-trip min/avg/max = 0.2/0.2/0.2 ms

    # iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP

    # ping -c 1 127.0.0.1
    PING 127.0.0.1 (127.0.0.1): 56 data bytes

    --- 127.0.0.1 ping statistics ---
    1 packets transmitted, 0 packets received, 100% packet loss
    #


Puedes ver aquí como funciona el ping (el parámetro '-c 1' le indica a ping que envíe un único paquete).

Despues añadimos (-A) a la chain 'INPUT' (de entrada) una regla especificando que los paquetes que vengan de 127.0.0.1 (-s 127.0.0.1) con el protocolo ICMP (-p icmp) deberán tomar la acción DROP (-j DROP)

Una vez hecho esto, probamos la regla con un segundo ping. El programa esperará una respuesta que nunca llegará Podemos eliminar esta regla de dos formas. La primera, ya que sabemos que es la única regla en la chain de entrada (input), podemos utilizar su número para borrarla:

              # iptables -D INPUT 1

La segunda forma es igual a la del comando -A, pero sustituyendo -A por -D. Esto es útil cuando tiene varias reglas complejas y no quieres tener que contarlas hasta encontrar la que buscabas. Para estos casos usaremos:

              # ipchains -D INPUT -s 127.0.0.1 -p icmp -j DROP

La sintáxis de -D debe ser exáctamente igual a la de -A (o -I o -R). Si hay  múltiples reglas iguales en la misma chain, sólo la primera será eliminada

miércoles, 8 de febrero de 2017

Reiniciar un campo identity en SQL Server

Frecuentemente una de las cuestiones más frecuentes que como administrador de sistemas llega a mi es como reiniciar el valor de identidad de una tabla en Sql Server.

Los valores identity aumentan de forma secuencial, si eliminamos los registros de una tabla, el valor identity no se inicializa, sino que continua con su último valor.

Para modificar este comportamiento utilizaremos el siguiente comando:

DBCC CHECKIDENT (<nombre_tabla>, RESEED,0)