Mostrando entradas con la etiqueta oracle. Mostrar todas las entradas
Mostrando entradas con la etiqueta oracle. Mostrar todas las entradas

domingo, 24 de enero de 2010

Retrieving Oracle patches with wget

Retrieving Oracle patches with wget

Update #1, 13-Nov-2009: While testing this patch download method in the wake of the recent My Oracle Support cutover, I noticed a new wrinkle. Instead of a successful patch download, I got the following message from wget:

Self-signed certificate encountered.
To connect to login.oracle.com insecurely, use `--no-check-certificate'.

After adding --no-check-certificate to the wget command, I was once again able to retrieve patches, but it took a bit longer than usual, as wget wandered through a tree of redirects. I've updated the code for the getOraPatch function accordingly.

Update #2, also 13-Nov-2009: A commenter on Chris Warticki's Oracle Support blog noted that the patch download page provided by the Flash version of My Oracle Support does not present a right-clickable Download button, which would seem to render the wget patch retreival method useless. Thankfully, there's a workaround: open a new window/tab in your browser, using an URL of the form https://updates.oracle.com/ARULink/PatchDetails/process_form?patch_num=nnnnnnn This will open a patch download page in a plain HTML, non-Flashy interface, and you should be all set to go!

No, no, this isn't a back door into the Metalink My Oracle Support patch repository. Don't get too excited. ;-)

While working from home this evening, I had to download some patches to a remote Linux system, and was struck, not for the the first time, by the inconvenience of it all. The usual options seem to be:

  1. Download the patches to a local machine and upload them to the remote system -- annoyingly manual at best, and downright gross when a VPN connection is involved.
  2. FTP from the remote system to updates.oracle.com. That's a tried-and true method, but still involves a lot of typing. Not anymore! This access option was disabled in November 2009, with the arrival of My Oracle Support.
  3. Start a VNC session on the remote system, launch a web browser, log in to Metalink My Oracle Support, and click the download button. Not a bad option...unless you can't use VNC for some reason, and are stuck with a command-line interface. Or if you're trying to navigate in that remote browser over a VPN connection. Not an exercise for impatient people.

When life gives you inconvenience, write a shell function!

At least, I think that's how the old saying goes. I created the following bash(1) function that uses wget to download a patch from updates.oracle.com, using the URL behind the Download button:

# Function to retreive patches from Metalink/My Oracle Support via wget
function getOraPatch {
[[ $mosUser ]] || read -p "Oracle Support Userid: " mosUser;
[[ $mosPass ]] || read -sp "Oracle Support Password: " mosPass;
fname=`echo $1 | awk -F"=" '{print $NF;}'`;
wget --no-check-certificate --http-user $mosUser --http-passwd $mosPass $1 -O $fname;
}

The above function prompts for the username and password that you use to access Metalink My Oracle Support. If the variables are already defined in your session, then it assumes you want to use the existing values and does not prompt you again. Then, the function parses the patch URL to find the patch's filename, and passes all four values (userid, password, URL, and filename) to wget.

Usage example

  1. Load the above function into your shell session, or copy and paste the code into your .bash_profile to have it loaded when you log in.
  2. Log in to Metalink My Oracle Support and locate the patch. Can't get around this step, but you can do it in a local browser, instead of dealing with a remote X session as described above in #3.
  3. Right-click on the Download button to copy the patch URL:
    Patch download window
  4. Invoke the function, enclosing the super-long patch URL in single quotes:
    oracle@testhost:/stage> getOraPatch 'really_long_patch_URL_copied_in_previous_step'
  5. Answer the prompts, and lean back and watch as wget retrieves your patch:
    Oracle Support Userid: your_MyOracleSupport_login_here
    Oracle Support Password: your_MyOracleSupport_password_here
    (some wget output snipped)
    HTTP request sent, awaiting response... 200 OK
    Length: 52,028 [application/zip]

    100%[====================================>] 52,028 --.--K/s

    22:27:24 (555.94 KB/s) - `pnnnnnnn_version_platform.zip' saved [52028/52028]

viernes, 8 de mayo de 2009

Descargar Oracle con wget

En varias ocasiones he necesitado descargar archivos del sitio de Oracle, ya sea para bajar nuevas versiones de la base de datos, application server, sqldeveloper, etc.

El caso es que siempre los había descargado desde el explorador Web y nunca había tenido problema. Hasta que esta semana el archivo de 1.8GB de la versión 11g de la base de datos no alcanzaba a bajar completo y tronaba la conexión del explorador teniendo que reiniciar la descarga en varias ocasiones.

Por eso decidí utilizar wget para la descarga de archivos desde el sitio de Oracle pero me encontré con el siguiente problema:

# wget -c http://download-llnw.oracle.com:80/otn/linux/oracle11g/linux.x64_11gR1_database_1013.zip

--2009-05-08 10:20:43-- http://download-llnw.oracle.com/otn/linux/oracle11g/linux.x64_11gR1_database_1013.zip
Resolviendo download-llnw.oracle.com... 208.111.133.53, 208.111.133.54
Connecting to download-llnw.oracle.com|208.111.133.53|:80... conectado.
Petición HTTP enviada, esperando respuesta... 302 Found
Localización: https://profile.oracle.com/jsp/realms/otnLogin.jsp?remoteIp=148.xxx.xxx.xxx&globalId=&redirectUrl=http%3a%2f%2fdownload-llnw.oracle.com%3a80%2fotn%2flinux%2foracle11g%2flinux.x64_11gR1_database_1013.zip [siguiendo]
Redirecciona a otra URL de autentificación...
--2009-05-08 10:20:44-- https://profile.oracle.com/jsp/realms/otnLogin.jsp?remoteIp=148.xxx.xxx.xxx&globalId=&redirectUrl=http%3a%2f%2fdownload-llnw.oracle.com%3a80%2fotn%2flinux%2foracle11g%2flinux.x64_11gR1_database_1013.zip
Resolviendo profile.oracle.com... 141.146.8.116
Connecting to profile.oracle.com|141.146.8.116|:443... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 4082 (4,0K) [text/html]
Saving to: `otnLogin.jsp?remoteIp=148.xxx.xxx.xxx&globalId=&redirectUrl=http:%2F%2Fdownload-llnw.oracle.com:80%2Fotn%2Flinux%2Foracle11g%2Flinux.x64_11gR1_database_1013.zip'

wget está guardando la página de autentificación...
100%[======================================>] 4.082 10,6K/s in 0,4s

2009-05-08 10:20:45 (10,6 KB/s) - `otnLogin.jsp?remoteIp=148.235.72.10&globalId=&redirectUrl=http:%2F%2Fdownload-llnw.oracle.com:80%2Fotn%2Flinux%2Foracle11g%2Flinux.x64_11gR1_database_1013.zip' saved [4082/4082]

En esa página de autentificación tenemos que poner nuestro usuario y contraseña de Oracle para poder descargar archivos del sitio.

Intentamos entonces con las opciones --http-user y --http-password de wget:

# wget -c http://download-llnw.oracle.com:80/otn/linux/oracle11g/linux.x64_11gR1_database_1013.zip --http-user=xxx --http-password=xxx

Obtenemos el mismo resultado que en el intento anterior:

--2009-05-08 10:29:05-- http://download-llnw.oracle.com/otn/linux/oracle11g/linux.x64_11gR1_database_1013.zip
Resolviendo download-llnw.oracle.com... 208.111.133.52, 208.111.133.54
Connecting to download-llnw.oracle.com|208.111.133.52|:80... conectado.
Petición HTTP enviada, esperando respuesta... 302 Found
Localización: https://profile.oracle.com/jsp/realms/otnLogin.jsp?remoteIp=148.xxx.xxx.xxx&globalId=&redirectUrl=http%3a%2f%2fdownload-llnw.oracle.com%3a80%2fotn%2flinux%2foracle11g%2flinux.x64_11gR1_database_1013.zip [siguiendo]
--2009-05-08 10:29:05-- https://profile.oracle.com/jsp/realms/otnLogin.jsp?remoteIp=148.xxx.xxx.xxx&globalId=&redirectUrl=http%3a%2f%2fdownload-llnw.oracle.com%3a80%2fotn%2flinux%2foracle11g%2flinux.x64_11gR1_database_1013.zip
Resolviendo profile.oracle.com... 141.146.8.116
Connecting to profile.oracle.com|141.146.8.116|:443... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 4082 (4,0K) [text/html]
Saving to: `otnLogin.jsp?remoteIp=148.235.72.10&globalId=&redirectUrl=http:%2F%2Fdownload-llnw.oracle.com:80%2Fotn%2Flinux%2Foracle11g%2Flinux.x64_11gR1_database_1013.zip'

50% [=============================> ] 4.082 11,5K/s in 0,3s

2009-05-08 10:29:06 (11,5 KB/s) - `otnLogin.jsp?remoteIp=148.235.72.10&globalId=&redirectUrl=http:%2F%2Fdownload-llnw.oracle.com:80%2Fotn%2Flinux%2Foracle11g%2Flinux.x64_11gR1_database_1013.zip' saved [4082/4082]

Se vuelve a guardar la forma de autentificación ya que el enlace de descarga directo no funciona para wget sin antes haber hecho la autentificación.

Tampoco me funcionó autentificarme en el explorador Web y después intentar con wget pero leí que a algunos les dió resultado.

La forma que yo encontré para hacerlo fue la siguiente:

Primero obtienes la URL de descarga de uno los intentos fallidos:

Localización:https://profile.oracle.com/jsp/realms/otnLogin.jsp?remoteIp=148.xxx.xxx.xxx&globalId=&redirectUrl=http%3a%2f%2fdownload-llnw.oracle.com%3a80%2fotn%2flinux%2foracle11g%2flinux.x64_11gR1_database_1013.zip

La parte en color azul es la URL de la cual wget va a intentar la descarga y ésta nos va a llevar a la forma de autentificación. Aquí es donde entra la parte en color rojo y la opción --post-data de wget y se usa como sigue:

$ wget -c --no-check-certificate --post-data="remoteIp=148.xxx.xxx.xxx&globalId=&redirectUrl=http://download-llnw.oracle.com:80/otn/linux/oracle11g/linux.x64_11gR1_database_1013.zip&username=xxx&password=xxx" https://profile.oracle.com/jsp/reg/loginHandler.jsp?

*Se sustituyen las x con la IP y con el usuario y contraseña del sitio de Oracle. A la parte que dice "redirectURL" tenemos que sustituirle los caracteres %2f por /.

La opción:
-c : se usa para poder continuar con la descarga en otro momento haciendo resumen.
--no-check-certificate : para que no verifique el certificado de seguridad del sitio.
--post-data : para enviar ciertos valores a la URL tales como usuario y contraseña, URL de descarga del archivo.

Una vez hecho esto el archivo comienza a descargarse sin problema:

$ wget -c --no-check-certificate --post-data="remoteIp=148.xxx.xxx.xxx&globalId=&redirectUrl=http://download-llnw.oracle.com:80/otn/linux/oracle11g/linux.x64_11gR1_database_1013.zip&username=xxx&password=xxx" https://profile.oracle.com/jsp/reg/loginHandler.jsp?

--2009-05-08 10:47:03-- https://profile.oracle.com/jsp/reg/loginHandler.jsp?
Resolviendo profile.oracle.com... 141.146.8.116
Connecting to profile.oracle.com|141.146.8.116|:443... conectado.
Petición HTTP enviada, esperando respuesta... 302 Moved Temporarily
Localización: http://download-llnw.oracle.com:80/otn/linux/oracle11g/linux.x64_11gR1_database_1013.zip [siguiendo]
--2009-05-08 10:47:05-- http://download-llnw.oracle.com/otn/linux/oracle11g/linux.x64_11gR1_database_1013.zip
Connecting to 192.168.254.4:3128... conectado.
Petición Proxy enviada, esperando respuesta... 206 Partial Content
Longitud: 1913850002 (1.8G), 1192940242 (1.1G) remaining [application/zip]
Saving to: `linux.x64_11gR1_database_1013.zip'

44% [++++++++++++++++++++++===> ] 845,732,744 228K/s eta 77m 27s

Espero les sea de utilidad.

jueves, 19 de febrero de 2009

Passwords en Oracle

Desde hace mucho tiempo, se conoce la forma en que el hash de oracle se calcula para las versiones menores a 11g. E incluso se conoce el algoritmo del cálculo del hash para 11g. 

Lo que es importante notar es que con el poder de cómputo de estos días, y con la debilidad del password de oracle, si no usamos passwords difíciles de crackear, podemos tener un riesgo de seguridad muy grande.

A continuación expongo un script, sólo con fines ilustrativos, la forma en que oracle calcula el hash

hashoracle.pl 


use warnings;
use strict;
use Crypt::CBC;
use Encode;
use Unicode::String qw(utf8 latin1 utf16);

my $llave = pack("H16", "0123456789ABCDEF");
my $usuario = 'Hugo';
my $password = 'abc123';

my $textoplano = uc($usuario.$password);
my $utf16 =utf8($textoplano);
my $octeto = $utf16->utf16;
my $IV = pack("H16", "0000000000000000");
my $cifrado = Crypt::CBC->new(
-key => $llave,
-cipher => 'DES',
-iv => $IV,
-header => 'none',
-padding => 'null',
-literal_key=>1,
);

my $textocifrado = $cifrado->encrypt($octeto);
my $cifrado1 = Crypt::CBC->new(
-key => substr($textocifrado, length($textocifrado)-8,8),
-cipher => 'DES',
-iv => $IV,
-header => 'none',
-padding => 'null',
-literal_key=>1,
);

my $textocifrado1 = $cifrado1->encrypt($octeto);
my( $hex1 ) = unpack( 'H*', $textocifrado1 );
my $temp1 = uc(substr($hex1,length($hex1)-16,16));
print "\n$temp1\n";
__END__



Si este script se pusiera en un ciclo infinito a buscar passwords para hacer un match contra un hash preestablecido, podría buscar aproximadamente 800,000 hashes por segundo, si este mismo script se pasara a C, podría buscar aproximadamente 1,300,000 hashes por segundo. Alex Kornbust tiene un programa que incluso puede hacer uso de threads en los CPUs y genera hasta 2,400,000 por segundo.

Así que pensemos que, de acuerdo a estudios realizados, un password de 8 caracteres, puede ser descubierto en tan sólo 20 días, de 9 caracteres, ya puede pasar del año, pero teniendo 40 computadoras descifrando passwords, el tiempo vuelve a 20 días, así que ¿cuál es mi recomendación?

Seguir de lleno las recomendaciones de Oracle:

- Crea los passwords entre 8 y 30 caracteres (yo recomendaría de 10 a 30 caracteres).
- Utiliza símbolos del Character Set para definir los passwords (#$_).
- Además de incluir un dígito y un alfanumérico, también incluye un signo de puntuación.
- No inicies un password con un número.
- No utilices palabras reservadas de oracle.
- No uses palabras de diccionario.

Adicionalmente podemos crear passwords más complejos, pero esto también nos limita el uso un poco:

Empecemos con passwords entre comillas


C:\>sqlplus / as sysdba

SQL*Plus: Release 10.2.0.3.0 - Production on Jue Ago 28 11:56:39 2008

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.


Conectado a:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options


SQL> alter user hugo identified by "de la sierra morena cielito";

Usuario modificado.

SQL> conn hugo/"de la sierra morena cielito";
Conectado.



En este punto tenemos un pequeño problema, o quizás sólo yo, pero no he podido pasar a nivel sistema operativo mi password, es decir, la conexión la debo de realizar con /nolog, o bien usando únicamente el usuario y esperar a que sqlplus nos pregunte el password.


C:\>sqlplus hugo/"de\ la\ sierra\ morena\ cielito"

SQL*Plus: Release 10.2.0.3.0 - Production on Jue Ago 28 12:00:23 2008

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.

ERROR:
ORA-01017: invalid username/password; logon denied


C:\>sqlplus hugo

SQL*Plus: Release 10.2.0.3.0 - Production on Jue Ago 28 12:01:43 2008

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.

Introduzca la contraseña:

Conectado a:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options


SQL>


C:\>sqlplus /nolog

SQL*Plus: Release 10.2.0.3.0 - Production on Jue Ago 28 12:02:43 2008

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.


SQL> conn hugo/"de la sierra morena cielito";
Conectado.



Algo de lo que podemos hacer uso, como bien nos recomienda oracle, es el uso de caracteres especiales, por ejemplo:



C:\>set NLS_LANG=spanish_america.we8pc850

C:\>sqlplus / as sysdba

SQL*Plus: Release 10.2.0.3.0 - Production on Jue Ago 28 12:05:04 2008

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.


Conectado a:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options


SQL> alter user hugo identified by querétaro;

Usuario modificado.



Al hacer esto, nos aseguramos que los passwords sólo funcionan con nuestro caracter set o alguno muy similar:


C:\>set NLS_LANG=spanish_america.we8iso8859p1

C:\>sqlplus /nolog

SQL*Plus: Release 10.2.0.3.0 - Production on Jue Ago 28 12:08:18 2008

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.


SQL> conn hugo/querétaro
ERROR:
ORA-01017: invalid username/password; logon denied

SQL> exit

C:\>set NLS_LANG=spanish_america.utf8

C:\>sqlplus /nolog

SQL*Plus: Release 10.2.0.3.0 - Production on Jue Ago 28 12:09:14 2008

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.


SQL> conn hugo/querétaro
ERROR:
ORA-01017: invalid username/password; logon denied

SQL> exit

C:\>set NLS_LANG=spanish_america.we8pc850

C:\>sqlplus /nolog

SQL*Plus: Release 10.2.0.3.0 - Production on Jue Ago 28 12:09:37 2008

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.


SQL> conn hugo/querétaro
Conectado.


De esta forma podemos asegurar más nuestros passwords y asegurar de una mejor forma nuestra base de datos.