jueves, 29 de agosto de 2013

Instalacion de Servidor Web Apache en Debian

Extraido el texto de: http://informatica.iessanclemente.net/manuais/index.php/Instalaci%C3%B3n_de_Servidor_Web_Apache_en_Debian

Contenido

Instalacion de Servidor Web Apache en Debian

# Instalación de Apache2
apt-get install apache2
 
# Arranque y parada del servicio:
service apache2 start | stop | status | restart | reload
 
# Rutas de ficheros de configuración:
/etc/apache2
 
/etc/apache2/apache2.conf: configuración de directorio raiz por defecto, logs, procesos, etc.
/etc/apache2/httpd.conf: configuraciones de usuario.
/etc/apache2/mods-available/: directorio de módulos disponibles
/etc/apache2/mods-enabled/: directorio de módulos habilitados
/etc/apache2/ports.conf: configuraciones de puertos.
/etc/apache2/sites-available/: configuración de sitios
/etc/apache2/sites-enabled/: configuración de los sitios que están habilitados.

Directivas utilizadas para la configuración de servidores virtuales y principal

  • ServerName: indica el nombre que se le dará al servidor web.
  • DocumentRoot: indica el directorio raíz del sitio para el servidor.
  • ServerAdmin: indica la dirección de correo del webmaster del sitio.
  • DirectoryIndex: indica los ficheros que podrán actuar como página índice del sitio.
Es conveniente organizar el sitio web mediante directorios, aunque es posible que Apache pueda acceder a otros que no se encuentran en la jerarquía del sitio que se ha definido, como por ejemplo para la ejecución de un script de una página dinámica. Se suele definir una estructura denominada contenedor para cada uno de los directorios a los que accederá Apache, incluyéndose una para el directorio raíz del sitio del servidor principal.
Estas estructuras, se reconocen por una etiqueta de inicio con el formato <Directory nombre_directorio> y otra de fin </Directory>.
Dentro de estas estructuras se definen directivas que por lo general, establecen distintos permisos sobre el directorio que tiene asociado.


Directiva Opciones Función
Options None No establece ninguna opción.
All Establece todas las opciones.
Indexes Permite visualizar páginas índice existentes en el directorio.
FollowSymlinks Permite seguir los enlaces simbólicos del directorio.
ExecCGI Admite la ejecución de scripts CGI.
AllowOverride None No establece ninguna opción. El servidor no leerá los archivos .htaccess
All Establece todas las opciones. Permite usar las directivas especificadas en .htaccess
FileInfo Muestra la información de los archivos del directorio.
Order allow,deny Primero aplicará los permisos de allow y luego los de deny.
deny,allow Primero aplicará los permisos de deny y luego los de allow.
Allow from all Admite cualquier acceso al directorio.
from IP Admite cualquier acceso al directorio proveniente de la dirección IP indicada.
from dominio Admite cualquier acceso al directorio desde el dominio especificado.
Deny from all Deniega cualquier acceso al directorio.
from IP Deniega cualquier acceso al directorio proveniente de la dirección IP indicada.
from dominio Deniega cualquier acceso al directorio desde el dominio especificado.


La configuración de un sencillo servidor web, requerirá modificar la directiva de la sección 2 DocumentRoot, indicando el directorio que ejercerá como ráiz del sitio web. Esta directiva tendrá asociada una estructura contenedora cuyo nombre de directorio coincidirá con el indicado en DocumentRoot.

Habilitar / Deshabilitar módulos

La inclusión de los módulos necesarios para ampliar la funcionalidad del servidor, se efectúa mediante la directiva LoadModule, seguido del nombre del módulo y el archivo (o librería) que lo contiene. Se utilizarán tantas directivas LoadModule, como módulos distintos se vayan a utilizar.
En Debian en el directorio /etc/apache2/mods-enabled tenemos enlaces simbólicos con la extensión .load, que indican el módulo que se va a cargar. Se pueden activar así o mediante la instrucción a2enmod (apache 2 enable module) seguida del nombre del módulo a habilitar. Por ejemplo:
# Para habilitar un módulo en Apache 2 se usa: a2enmod
# Habilitamos por ejemplo el módulo usertrack
a2enmod usertrack
 
# Para deshabilitar un módulo en Apache 2 se usa: a2dismod
# Deshabilitamos por ejemplo el módulo usertrack
a2dismod usertrack

Proteger directorios

Hay dos formas de proteger directorios en Apache:
Antes de ejecutar cualquier de los dos métodos, hay que asegurarse que el módulo auth_basic está habilitado en: /etc/apache2/mods-enabled.
1.- Creando fichero .htaccess en el directorio a proteger:
# Para proteger un directorio en Apache2.
# Dentro del directorio que queremos proteger creamos un fichero .htaccess con este contenido:
 AuthName "Acceso Restringido a este recurso"
AuthType Basic
AuthUserFile /usr/local/apache2/etc/.htpasswd
Require valid-user
 
# Si queremos permitir el acceso sólo a un usuario específico, pondremos:
Require user nombreusuario
 
# Crearemos el fichero de contraseñas, y lo pondremos 
# en un directorio fuera de la raíz web, para más seguridad:
mkdir -p /usr/local/apache2/etc
 
# Creamos el fichero de contraseñas .htpasswd (lo ponemos oculto para dar más seguridad),
# con un usuario al que llamamos admin (nos pedirá la contraseña al pulsar ENTER).
# Creación del fichero de contraseñas:
htpasswd -c /usr/local/apache2/etc/.htpasswd admin
 
# Para añadir más usuarios al fichero de contraseñas (por ejemplo antonio):
htpasswd /usr/local/apache2/etc/.htpasswd antonio
 
# Editar el directorio virtual en el fichero de configuración del Apache2 a proteger en:
nano /etc/apache2/sites-available/default
 
# Activar la opción AllowOverride All:
    <Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
 
    Order allow,deny
    allow from all
    </Directory>
 
# Por último reiniciar el servicio Apache:
service apache2 restart
2.- Editando la configuración del sitio web: En lugar de crear un fichero .htaccess con la configuración de autenticación, editaremos la configuración del sitio web.
# Crearemos el fichero de contraseñas, y lo pondremos 
# en un directorio fuera de la raíz web, para más seguridad:
mkdir -p /usr/local/apache2/etc
 
# Creamos el fichero de contraseñas .htpasswd (lo ponemos oculto para dar más seguridad),
# con un usuario al que llamamos admin (nos pedirá la contraseña al pulsar ENTER).
# Creación del fichero de contraseñas:
htpasswd -c /usr/local/apache2/etc/.htpasswd admin
 
# Para añadir más usuarios al fichero de contraseñas (por ejemplo antonio):
htpasswd /usr/local/apache2/etc/.htpasswd antonio
 
# Editamos el sitio web que queremos proteger y el directorio en particular:
nano /etc/apache2/sites-available/default
 
#Añadimos las directivas necesarias en el directorio a proteger:
AuthType Basic
AuthName "Acceso Restringido a este recurso"
AuthUserFile /usr/local/apache2/etc/.htpasswd
Require valid-user
 
# Si queremos permitir el acceso sólo a un usuario específico, pondremos:
Require user pepe antonio maria

Información adicional sobre fichero .htaccess

# Directivas para redireccionar todas las peticiones HTTP
# a peticiones HTTPS
 
RewriteEngine on
DirectoryIndex index.php
RewriteCond %{SERVER_PORT} ^80$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
 
# Directiva para redireccionar los .html a sus correspondientes .php
# pasando el parámetro definido como inc (Query)
RewriteRule ^([^/]+).html$ index.php?inc=$1 [QSA,L]
Para más información sobre este tipo de directivas, visitar: http://www.askapache.com/htaccess/ssl-example-usage-in-htaccess.html

Servidores Virtuales en Apache

Nuestro servidor web puede servir múltiples webs a la vez, empleando una IP o varias.
Para poder hacer ésto, Apache necesita diferenciar el acceso a cada una de las webs, y para ello lo puede hacer de dos formas:
  1. Configurando puertos distintos para cada web, y el acceso se hará a través de cada puerto.
  2. A través de los diferentes nombres de dominio alojados en el servidor y que se conectan a un mismo puerto 80 (por ejemplo).

Acceso a través de puertos distintos

Para configurar el acceso a diferentes webs, a través de puertos diferenciados, lo primero que tenemos que hacer es configurar los VirtualHost en nuestro servidor de Apache, e indicar los puertos dónde queremos que escuche nuestro servidor web.
Editaremos el fichero /etc/apache2/ports.conf:
#Vamos a habilitar los puertos dónde va a escuchar nuestro servidor Apache:
nano /etc/apache2/ports.conf
 
Listen 80
Listen 9999
 
# Si queremos que Apache escuche en unas IP específicas tendremos que poner también la IP:puerto
Listen 192.168.2.250:80
 
# Mediante la directiva NameVirtualHost indicaremos que vamos a tener hosts virtuales.
# El asterisco indica que vamos a recibir peticiones de VirtualHost en todas las IP en las que 
# está escuchando nuestro servidor web. Si nos interesa una IP específica la indicaremos.
# A continuación pondremos : y el número de puerto.
NameVirtualHost *:80
 
# Para cada servidor virtual, crearemos una línea como la anterior. Por ejemplo, añadimos una más:
NameVirtualHost *:9999
Si queremos que se muestren webs diferentes al acceder por un puerto u otro, editaremos las directivas correspondientes dentro del fichero /etc/apache2/sites-available/default, que es el sitio habilitado por defecto y configuraremos los parámetros de DocumentRoot, DirectoryIndex, ServerName, etc.

Acceso a través de nombres de dominios diferentes

En este caso el puerto será común a todos los servidores virtuales, con lo que en principio el fichero ports.conf podemos tener algo como:
NameVirtualHost *:80
Listen 80
Crearemos un fichero con la configuración que queramos dar al nuevo sitio virtual, de esta manera evitaremos que el fichero default crezca demasiado en tamaño y se haga complicada su edición. Ese nuevo fichero lo haremos en /etc/apache2/sites-available/.
# Por ejemplo:
nano /etc/apache2/sites-available/servidor1.local
Para cada servidor virtual se deberá crear un fichero como el mencionado anteriormente, y dentro se creará un contenedor donde se incluirán sus correspondientes directivas (ServerName, DocumentRoot, ServerAdmin, DirectoryIndex). Cada contenedor, generalmente, está delimitado por las etiquetas con formato <VirtualHost direccion-de-red:puerto> y </VirtualHost>.
Por ejemplo, éste sería el contenido mínimo para un servidor virtual servidor1.local:
<VirtualHost *:80>
ServerName www.servidor1.local
DocumentRoot /var/www/servidor1.local
ServerAdmin webmaster@servidor1.local
DirectoryIndex index.html index.php
</VirtualHost>
Por tanto se deberán crear tantos contenedores de este tipo como servidores virtuales se necesiten. Como valor dirección-de-red se indicará uno de los valores previamente definidos con las directivas NameVirtualHost ("*" o una dirección IP), dependiendo por donde queremos que el servidor virtual atienda las solicitudes. </source>

Habilitar / Deshabilitar sitios web

Para habilitar un sitio virtual que tenemos definido en la carpeta /etc/apache2/sites-available/ lo haremos mediante el comando a2ensite nombredelsitio. Por ejemplo:
# Suponiendo que en /etc/apache2/sites-available tenemos un sitio www.pruebas.local
# Lo habilitaremos con:
a2ensite www.pruebas.local
 
# Para deshabilitarlo lo haremos con:
a2dissite www.pruebas.local
 
# Reniciaremos el servicio a continuación:
service apache2 restart


Estructura web recomendada para múltiples sitios web

En muchas organizaciones mantienen una estructura determinada a la hora de colocar aplicaciones en sus servidores web. Aquí va una guía de cómo organizar y estructurar el servicio web:
1.- Modificar la raíz del sitio web, como si fuera una aplicación web: en nuestro caso al instalar Debian la raíz del sitio web es /var/www. Lo que haremos es crear una carpeta llamada htdocs por ejemplo y modificaremos la directiva DocumentRoot en el fichero /etc/apache2/sites-available/default al directorio /var/www/htdocs.
nano /etc/apache2/sites-available/default
 
DocumentRoot /var/www/htdocs
 
 <Directory /var/www/htdocs/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>
2.- Si queremos instalar una nueva aplicación web en nuestro servidor web haremos:
  • Crear el directorio principal de la aplicación en /var/www/, siguiendo esta estructura:
mkdir -p /var/www/aplicacion/htdocs
  • Dentro de la carpeta htdocs de la aplicación, copiaremos todos los archivos de la misma.
3.- Una vez copiados todos los archivos tendremos que crear el fichero de configuración de Apache para esa aplicación. Ese fichero lo crearemos en el directorio /etc/apache2/sites-available/.
Un ejemplo de configuración para una web de programación de aplicaciones podría ser:
# Esta recomendación es demasiado extensa. Se cita a modo de ejemplo, pero no se 
# utilizará en ningún ejercicio.
nano /etc/apache2/sites-available/aplicacion
 
<Directory /var/www/htdocs/aplicacion>
        Order allow,deny
        Allow from all
     Options +FollowSymLinks
        Allowoverride all
        RewriteEngine on
        php_admin_value open_basedir /var/www/htdocs/aplicacion:/var/www/properties/:
/var/www/aplicacion:/var/www/logs/:/tmp/
</Directory>
<Location /aplicacion>
        SetEnv PROPDIR /var/www/aplicacion/properties
        SetEnv RUTAAPP /var/www/aplicacion/htdocs
        SetEnv FILEDIR /var/www/aplicacion/files
</Location>
4.- Por último quedaría realizar un enlace simbólico desde /var/www/htdocs/ al directorio htdocs de nuestra aplicación:
# Creamos el enlace simbólico desde la carpeta raíz de nuestro servidor web a nuestra aplicación
cd /var/www/htdocs
ln -s /var/www/aplicacion/htdocs/ aplicacion
 
# De esta forma al poner http://ipservidor/aplicacion nos conectará 
# con la carpeta /var/www/aplicacion/htdocs
 
# Reiniciamos el servicio web
service apache2 restart
De esta forma tendremos físicamente nuestra aplicación web, fuera del directorio raíz del servidor.

Instalación de certificados y acceso seguro con HTTPS

Si queremos usar conexiones seguras mediante el protocolo HTPS para acceso a determinadas páginas, tendremos que configurar Apache para que cargue el módulo ssl , aunque en algunas versiones de Apache 2 suele venir integrado.
Comprobaremos si está o no instalado consultando el directorio /etc/apache2/mods-enabled, y en el caso de que no esté lo habilitaremos con a2enmod ssl.
a2enmod ssl
Necesitaremos tener instalado además OpenSSL (apt-get install openssl), que se encarga de la implementación SSL para llevar a cabo transferencias seguras. Este módulo no se recomienda en configuraciones con más de un servidor virtual que utilicen el mismo puerto de escucha, ya que la conexión SSL del cliente se establece con una IP y puerto determinado del servidor. Apache no sabrá con qué servidor virtual debe utilizar SSL, escogiendo el primero que se encuentra, y no utilizará conexiones seguras para el resto de servidores virtuales.
Más información de por qué no se puede usar SSL con virtual hosts basados en nombre: http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts
Para corregir este problema se utiliza la extensión TLS denominada SNI (Server Name Indication o Indicación de Nombre de Servidor), necesitando tener instalado el paquete libapache2-mod-gnutls (para cargar el módulo gnutls en vez de ssl).
Más información sobre SNI en: http://en.wikipedia.org/wiki/Server_Name_Indication
Se podría tener un servidor virtual principal para el sitio principal y que atiende en el puerto 80, y un servidor virtual para el sitio seguro que atiende en el puerto 443 y que utiliza SSL.
Para ofrecer páginas de forma segura en un sitio web, el servidor necesita un certificado que apruebe su autentiticidad. Para generar un certificado autofirmado hay que ejecutar la instrucción make-ssl-cert, y se nos solicitará información para completar ese certificado. Tendremos que indicarle como parámetro el fichero con extensión ".pem", que se generará al final de la ejecución y que contendrá las claves para efectuar el cifrado asimétrico por el servidor.
Es necesario habilitar el puerto de escucha mediante la directiva Listen 443. Además serán necesarias las siguientes directivas:
  • SSLRequireSSL: se usa en el contenedor <Directory> y fuerza la utilización de SSL, evitando su desactivación.
  • SSLEngine: habilita SSL (valor on) en un servidor virtual, si se deshabilitó en el servidor principal.
  • SSLCertificateFile: indica la ruta del fichero (.pem) que contiene el certificado.
Para crear un certificado autofirmado que guardaremos en la carpeta /etc/apache2/certificados/certificado1.pem ejecutaremos el siguiente comando:
# Creamos el directorio dónde almacenaremos los certificados:
mkdir -p /etc/apache2/certificados
 
# Generamos el fichero .pem que contendrá el certificado:
# Con esta instrucción o bien con:
make-ssl-cert /usr/share/ssl-cert/ssleay.cnf   /etc/apache2/certificados/miweb.local.pem
 
openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/certificados/miweb.local.pem -keyout
 /etc/apache2/certificados/miweb.local.pem
 
 
# Respondemos a las preguntas que se nos hacen en la generación del certificado.
 
# Damos permisos de lectura al certificado
chmod 600 /etc/apache2/certificados/miweb.local.pem
 
# Habilitamos el soporte SSL
a2enmod ssl
 
# Reiniciamos el servicio
service apache2 restart
Tendremos que editar el archivo /etc/apache2/ports.conf para indicar que queremos que nuestro servidor web también escuche en el puerto 443. Lo más normal es crear un servidor virtual que escuche en el puerto 80 y el mismo pero escuchando en el puerto 443:
# Editamos el fichero /etc/apache2/ports.conf:
nano /etc/apache2/ports.conf
 
# Añadimos los servidores virtuales:
Listen 80
Listen 443
 
NameVirtualHost  *:80
NameVirtualHost  *:443
Ahora nos queda revisar y configurar los contenedores de los sitios disponibles para habilitar las opciones SSL. En el directorio /etc/apache2/sites-available revisaremos los contenedores:
# Editamos el fichero /etc/apache2/sites-available/miweb.local
nano /etc/apache2/sites-available/miweb.local
 
# Comprobamos los contenedores y activamos las opciones correspondientes SSL:
# Comenzamos con el sitio SSL:
 
<VirtualHost *:443>
        ServerName      miweb.local
        DocumentRoot    /var/www/miweb.local/htdocs
        DirectoryIndex  index.html
        SSLEngine on
        SSLCertificateFile  /etc/apache2/certificados/miweb.local.pem
 
        <Directory /var/www/miweb.local/htdocs>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride none
                Order allow,deny
                Allow from all
                SSLRequireSSL
        </Directory>
</VirtualHost>
 
<VirtualHost *:80>
        ServerName      miweb.local
        DocumentRoot    /var/www/miweb.local/htdocs
        DirectoryIndex  index.html
</VirtualHost>
 
 
# Si tenemos un sitio default-ssl y lo habilitamos, revisaremos en ese fichero
# las rutas del certificado y activamos estas opciones:
 
SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
 
SSLCertificateFile    /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key
 
 
 
# En el ejemplo anterior se permite el acceso a miweb.local en modo seguro y modo normal.
# Si quisiéramos crear dos webs diferentes para el acceso seguro o normal,
# simplemente modificaríamos los directorios DocumentRoot dónde se alojan los ficheros y ya está.
Por último nos falta habilitar el nuevo sitio que hemos hecho:
a2ensite miweb.local
 
# Reiniciamos el servidor apache para aplicar cambios:
service apache2 restart

jueves, 22 de agosto de 2013

HpAllInOne


Content Cleanup Required: This article should be cleaned-up to follow the content standards in the Wiki Guide. More info...

Supported Models

Printing and scanning with HP All-In-One (AIO) printers is supported by the hplip project. The hplip package is included in Ubuntu and Debian and no other software is needed. The older 'hpoj' package is obsolete and is only used to support parallel connections and for CUPS and SMB shared printers.
Almost all HP All-in-Ones are supported, even new ones. See the Supported Devices list for details.

Setup

1. Connect the printer as follows:
  • All models can be connected by USB cable. Connect the cable, turn the printer on, and go to the next step.
  • Some models feature wired and/or wireless networking:
    • To connect by wired network, connect the printer's Ethernet port to your router by network cable.
    • To connect by wireless connection, press the printer Setup button and use the arrow keys to highlight the Network (sometimes Wireless) menu and press OK. Select Wireless Setup Wizard under the Network and press OK again. Follow the prompts and enter a WEP or WPA security key if prompted.
    • Note: the 2008 Photosmart C4300 series and C4500 series All-in-Ones require first time setup by connecting by USB cable and running the HP Installation under Windows or a Mac. Once joined to the wireless network, they can be used from Linux.
2. Delete any entries for this printer in System->Administration->Printers.
3. Run HP Setup from the console. This will walk you through the setup for USB, network or parallel connections.
sudo hp-setup
Scanning and other features such as memory card image transfer should now work. To see a list of HP utilities, in the console enter 'hp-' and Tab. For example, use hp-toolbox to do printer maintenance or check ink levels.
This wiki page has screenshots of hp-setup.

Troubleshooting

Run:
sudo hp-check -r
This will summarize any installation errors.
Post support questions at the project Launchpad page.

fax ppd missing

Someone broke a dependency somewhere, so install hplip-cups and you're all set:
sudo apt-get install hplip-cups

error: hp-setup requires GUI support

In Ubuntu 9.10, you need to execute sudo apt-get install python-qt4 in a terminal before running hp-setup, or you'll get:
warning: Qt/PyQt 4 initialization failed.

error: hp-setup requires GUI support (try running with --qt3). Also, try using interactive (-i) mode. 

Networked Scanner

Note: the following is not necessary if you run hp-setup as above.
If your all-in-one printer is on a network and you use the Gnome Printers window to add the printer as an HP Jet-Direct printer, then you will not be able to scan. To solve this problem, you must first determine the URI of the printer by executing inside a terminal window:
hp-makeuri IP-ADDRESS
where IP-ADDRESS should be replaced with the IP address of your printer. This will show the CUPS (printing) and SANE (scanning) URIs for your printer.
Next, there are two approaches to accessing the networked scanner:
1. You can temporarily access the scanner by supplying the SANE URI to xsane every time you execute it:
xsane SANE-URI
where SANE-URI is the SANE URI returned by hp-makeuri.
2. The scanner will be permanently accessible if CUPS is configured to use the 'hp' backend to access the printer instead of the 'socket' backend (i.e., the Jet Direct backend). This can be done by editing printers.conf:
gksudo gedit /etc/cups/printers.conf 
and replacing the 'socket' DeviceURI with the 'hp' URI returned by hp-makeuri. Restart cups after making this change:
sudo /etc/init.d/cupsys restart 
The scanner should now be permanently accessible and you can use the HPLIP Toolbox to examine that status of your printer. The downside of this solution is that the Gnome Printers window should no longer be used to modify this printer as it is likely to get confused and overwrite your DeviceURI with something that HPLIP cannot understand. One possible solution to this problem is to add the same printer twice: once as a Jet Direct printer and again using the 'hp' backend. The Jet Direct version can be used for printing and printer configuration, while the 'hp' version can be used for scanning and checking ink levels with the HPLIP Toolbox.

Older Notes

Models known to work

See Supported Models above.
These instructions are also known to work with the following HP PSC printers:
  • 1100 / 1200 Series all-in-one printer. This little compact printer do function too.
  • 1210
  • 1315
  • 1410v
  • 1610 (install firmware update from HP if you own this!)
  • 2115 (Use the 2110 ppd)
  • 2510
  • Photosmart 2575 (Ethernet and USB)
  • Deskjet F380
  • Deskjet F4180
  • Deskjet F4280
  • Photosmart 2610 (via Ethernet, USB not tested but should work, Printer (cups) and Scanner (xsane) both working, fax only configured successfully but not tested, on Lucid and Maverick)
  • Photosmart 2710
  • 3055 Network-scanner
  • 4200 Officejet series (Worked with 4215 all in one fax anyway with instructions below)
  • Color LaserJet 2600n (Color doesn't work well)
  • Color LaserJet 2840
These instructions will also work for other HP all-in-one printers, and are known to work with the following models:
  • Photosmart C7280 (64-bit Lucid, USB connected, plug&play worked, haven't tried scanner)
  • Officejet G55 (both print- and scanner-modules works like a charm)
  • Photosmart C4440 (print worked instantly on Hardy Heron, just plug and go, Scanner works with instructions below)
  • Officejet 4110 (Normally works with plug and go, but these instructions also work perfectly)
(Please update the list if your printer is not in any of the above lists and these instructions work for you.)
There have been issues in the past with getting both printing and scanning to work at the same time. The setup resulting from these instructions supports both printing and scanning.
At the bottom I have added how to do this with HPLIP. -Shiven

Scanning

Try running XSane to scan (from Applications->Graphics).

Printing

1. Restart the CUPS system to see the new hpoj service by running
sudo /etc/init.d/cupsys restart
  1. In System->Administration->Printers double-click "New Printer".
  2. Select "Use another printer by specifying a port:".
  3. Do not select "Detected printers" or your print jobs will hang.
  4. In the drop-down select the entry beginning with "PTAL".
  5. Hit Forward, select your model or the closest to it, and press Apply.
  6. Printing should now work. Test by right-clicking the newly created printer icon, choose Properties, then click Print a Test Page.

Setting up printers to use HPLIP.

Known to work with: hppsc 1210. I don't have another printer, but this works well for me.
Preamble: So you want your printer to scan and print? But you also want the tools from HP to go with it! This is fairly simple; it just takes a bit of configuration.
Step 1: Run synaptic (System->Admin->Synaptic). Put in your password, and search for 'hplip'.
Install all three packages, then move to Step 2.
Step 2: Once the tools are installed, you will need to restart your printer, and also run /etc/init.d/cupsys restart, to update your CUPS interface. this is CRUCIAL!
Step 3: Go and download the appropriate module for your printer (gimp-print doesn't have the correct modules for PSC model printers, so go to http://www.openprinting.org/printers and get the driver for your printer (about 20kb)). Copy this driver into the folder of your choice (I chose /usr/share/hplip/data; remember the folder because you're going to need it in the next step).
Step 4: Run System->Administration->Printers, input your password, and install a new printer. Do NOT use the detected printers, use the location that appears when you select "Use another printer by specifying a port". Click next, go to HP at the top (if it isn't already selected), then go to Install Driver. Select the ppd file from your location, so in my case /usr/share/hplip/data/hp_psc_1210.ppd, and then follow the prompts until it finishes.
Step 5: Add hpaio to the end of /etc/sane.d/dll.conf. This is so the SANE backend can work with HPLIP.
Step 6: Test page baybee! If it works, run xsane and give the scanner a run and you're good to go!
Known problems: I haven't found anything. The hp-toolbox (system -> preferances -> hp toolbox) seems acurate, and... well, everything just works. What else could you want? -
The above does not work for networked printers. I got my HP Laserjet 1200 to be seen by HPLIP as follows:
Grab the ppd file as detailed above.
Run hp-makeuri IPADDRESS where IPADDRESS is your printer's local ip address (mine is 192.168.0.150). Save the result.
Mine was: hp:/net/HP_LaserJet_1200?ip=192.168.0.150
Install kprinter. The gnome printool does not allow installation of hp:// addresses at present (correct me if I'm wrong please).
sudo kprinter
Click on install wand and follow wizard.
Click on "other printer type".
Insert URI produced by hp-makeuri command.
Click "other" at driver step and select the ppd file.
Click to finish and REBOOT machine (a cupsys restart was not enough for me).
On restart HPLIP should pick up networked printer as well as your local ones.

FUNCIONAMIENTO DEL SERVICIO WEB

CONCEPTOS GENERALES
En este articulo voy a explicar que hay detrás de una dirección web, ósea, cuando tipiamos en nuestro navegador http://www.innobyte.blogspot.com/, y nos aparece mágicamente la pagina solicitada.

En realidad esa magia no existe, sino que cuando enviamos esa dirección, nuestra PC a través del protocoló TCP/IP se comunica con un servidor llamado DNS donde convierte la dirección de texto en un numero horrible difícil de recordar, un ejemplo es 64.233.161.103(http://www.google.com.ar/), realmente ustedes podrían acordarse !!!.

Imaginen todas los sitios que conocen, si en vez de tenerlos por sus nombres lo tendrian por el numero IP, seria imposible. Ademas seria muy dificultoso su reconocimiento. ("En 72.3.45.3 tenemos los mejores zapatos" upss..., no es muy razonable).

Entonces ese servidor DNS (Domain Name Service), envía nuestra petición a través del protocolo TCP/IP al servidor en el cual está alojado la website solicitado.

Para que tenga una mejor idea, el DNS es como una guía de teléfono, al consultamos cual es el teléfono de Juancito, en este caso Juancito seria nuestra dirección http://www.innobyte.blogspot.com/ y el número de teléfono, el numero de IP mencionado.

Encontrado el servidor envía nuevamente esa petición a nuestra computadora permitiéndonos ver el sitio web en nuestro browser (Internet Explorer, Mozilla, Opera,…), y esta página es guardada en nuestro pequeño DNS que posee nuestra PC, lo cual permite que la próxima vez no pase por el servidor DNS, sino que se conecta directamente ya que la conversión de Nombre a Numero lo hizo, y veremos que entrara más rápidamente al sitio web.

Ahora bien, explicado brevemente como seria el funcionamiento, ingresamos más profundamente en esta maraña de servidores y damos con el servidor donde está alojado realmente el sitio web.

Este servidor está compuesto principalmente por un sistema operativo (Linux o Windows), un servidor web propiamente dicho (IIS o Apache), y que además dependiendo de la tecnología que utilizamos, necesitaremos de otros servidores, como son los de base de datos y los que consultan a estos servidores, siendo que esto últimos se ven reflejados en nuestra www, cuando vemos en nuestro browser aparecer en cierto casos www.mipagina.com.ar/index.php o .../index.asp.

El servicio php o asp es una servicio que nos permite crear website dinámicos, esto quiere decir que podemos tener bases de datos en nuestro sitio web, o que nuestro sitio web se arme haciendo consultas a la bases, esto hoy día sucede en las mayorías de los portales donde la información es totalmente dinámica. Ya que detrás tiene un sistema de actualización dinámico para facilitar en mayor medida su actualización.

VARIOS VIRTUALHOST EN APACHE

En primer lugar este blog lo uso como refresca memoria, de aquellos tips que no utilizo frecuentemente, pero que son importates en ciertos momentos.

Uno de ellos es crear varios virtualhost sobre un mismo servidor apache, por ende estamos hablando de un apache 2.2.x dentro del directrio extra de la carpeta conf y habiendo anteriormente habilitado en httpd.conf el include del archivo httpd-vhost.

NameVirtualHost *:80

ServerAdmin info@netconn.com.ar
DocumentRoot "/workspace/www/Biblioteca"
ServerName biblioteca
ErrorLog "logs/biblio-error.log"
CustomLog "logs/dummy-host2.smarc-access.log" common

Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all



Con la etiqueta Directory habilitamos el Path de DocumentRoot mas arriba escrito, sin depender
del httpd.conf

REDIRECCIONAMIENTO CON APACHE

Bueno hoy tengo un dia excelente, dos post en un mismo dia, y que POST, espero que realmente le sirva a alguien.

Estamos en httpd.conf, dentro de la etiqueta ifmodules donde se encuentra el ScriptAlias /cgi-bin/ , de bajo de esta ultima linea mencionada colocamos lo siguiente

Redirect permanent /otraplicionweb http://www.otraplicionweb.com.ar

Ejemplo

http://www.nuestraplicacion.com.r/otraplicacionweb
Veremos que redirecciona hacia la nueva aplicacion

TROUBLESHOOTING DE APACHE

Una de los problemas que suele ocacionar en los principiantes para instalar Apache desde apt-get ya sea Ubuntu o Debian es cuando debemos configurar el sitio web para que sea levantado por Apache.

El apache instalado como antes se dijo crea en /etc/apache2 una carpeta con los archivos de configuración y además una carpeta sites-available, donde se encuentra el archivo default, el cual contiene las directivas para crear los nuevos virtual host que se instalaran.

Bien, si queremos configurar otro sitio con las siguientes características: DocumentRoot, ServerAdmin , ServerName, etc, distintos al default, lo mejor es crear en el directorio un archivo que identifique al sitio web, ejemplo: "netconn" y dentro de el escribimos las directivas del sitio propiamente dichas.

Una vez echo esto vamos al archivo default, y debajo de la etiqueta escribimos:.

include /etc/apache2/sites-available/netcoon .

luego guardamos y reiniciamos el servidor apache.

Espero le sea util!! son pequeños tips para tener en cuenta

TIP'S ENTENDIENDO LA PROGRAMACION POO

  • Las funciones son una manera de encapsular sentencias y variables.
  • Las clases son una manera de encapsular métodos, variables y constantes.
  • Los namespace son una manera de encapsular clases, funciones , variables y constantes.
Cuanto más encapsulado esté todo más fácil será su portabilidad, menos errores de conflicto habrá y más fácil será su actualización.

lunes, 5 de agosto de 2013

How to find the top domains currently being processed by your postfix mail queue.

Extraido de la pagina : http://answers.oreilly.com/topic/1046-how-to-find-the-top-domains-currently-being-processed-by-your-postfix-mail-queue/

S
Posted Feb 01 2010 11:07 AM

If you want to get a glimpse of what's grinding away in your postfix MTA's mail queue, this simple bash one liner will give you the top 15 domains that it's working with:

$ mailq | grep ^[A-Z\|0-9] | awk '{print $7}' | cut -d@ -f2 | sort | uniq -c | sort -rn  | head -15


To break it down, we're first getting a queue list by running the mailq command. Then we pipe that to grep and filter for only those lines that begin (^) with a capital letter [A-Z or (\|) a number 0-9], which gives all lines that begin with a Queue-ID.

If we look at one of those lines, we see that the 7th field contains the email address of the sender and that's what we grab using the awk statement. Then we split the email address on the @ symbol and just grab the second field which is the domain (cut -d@ -f2).

Then we sort those results and pipe them to the uniq utility which we use to count the references. With those counts in place, we do a reverse sort on the counts (sort -rn) in order to give us the busiest domains first and then use the head statement to just give us the top 15.

When it's all done, you get something like this as output:

   1274 example100.com
     89 example2.com
     85 example3.org
     83 example5.net
     68 example8.info
     64 example10.org
     57 example7.com
     55 example15.com
     50 example1.net
     50 example20.com
     45 example45.com
     41 example60.net
     40 example33.com
     38 example6.com
     38 example34.com

This post has been edited by Jim-J: 02 February 2010 - 07:10 AM

Jugando con mailq

Extraido de la pagina: http://www.userlinux.net/1211_jugando_con_mailq.html

Cuando falla la entrega en un servidor de correo lo lógico es que la cola se vaya llenando hasta reparar el problema. En ese momento las peticiones irán saliendo con cierto orden de prioridad. Hay varios comandos con los que podemos jugar para ayudar al servidor en el proceso de peticiones.

Con un poco de paciencia, conocimientos mínimos de bash y usando tanto mailq como postsuper (Postfix) podremos facilitar el flujo de correos encolados. Vamos a ello. Primero miramos el número de correos que tenemos en cola. Esta operación se puede hacer de diversos modos: 
 
# mailq | tail -n1
-- 70865 Kbytes in 1654 Requests.
# mailq | grep Requests
-- 70865 Kbytes in 1654 Requests.
 
Una vez sabemos el número exacto de correos que están esperando a ser procesados podemos hacernos una idea del tiempo que nos puede llevar reestablecer el normal funcionamiento del servicio.

Para ver una descripción algo más detallada de los correos (id, fecha, origen, destino...) podemos usar mailq sin más modificadores, obviamente el resultado será un chorizo tremendo si hay muchos Requests. Probemos a ver las 20 primeras lineas: 
 
# mailq | head -n20
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
9A792414C6B*   30256 Fri Oct 26 11:41:30  tequilasunrise270@liberotta.it
                                         alguien@server

387924150E9*   41997 Fri Oct 26 11:26:53  1784@lavoca.es
                                         mas@server

1AB8D4141C3*    1163 Fri Oct 26 11:29:51  AIMEE-Jenksya@ariastone.com
                                         otrouser@server

D5808414C6F*   22998 Fri Oct 26 11:41:35  sateve@zongati.com
                                         alguien@server

81983414DDC*     518 Fri Oct 26 11:28:13  otrouser@server
                                         alguien@server

274104137A6*  170349 Fri Oct 26 11:28:19  tequilasunrise270@liberotta.it
                                         mas@server

CCC684141CC*   38295 Fri Oct 26 11:29:20  sateve@zongati.com
 
Nota: He modificado las direcciones de correo por no facilitar datos reales que puedan afectar al ejemplo ni al correcto funcionamiento de dichas cuentas.

Podemos comprobar que algunos de los correos en cola son correctos, otros spam o correo no deseado. Como trataremos de facilitar la tarea del servidor, podemos borrar los que veamos como no deseados.

Pongamos que tequilasunrise270@liberotta.it es uno de los correos a eliminar, nos fijamos en su ID (primer campo): 9A792414C6B y lo referenciamos con postsuper -d
 
# postsuper -d 9A792414C6B
postsuper: 9A792414C6B: removed
postsuper: Deleted: 1 message
#
 
Sencillo -aunque tedioso- si la cola no llega a 50 correos, si jugamos con números más grandes el asunto se complica y el proceso empieza a alargarse notablemente en el tiempo. Es la hora de aplicar un poco de scripting.

Imaginemos que tequilasunrise270@liberotta.it nos ha estado inundando a correos en casi todas las cuentas del servidor, en vez de ir buscando el ID de una en una: 
 
# mailq | grep tequilasunrise270@liberotta.it
 
Podemos sacar de forma más directa el ID con cut y pasarlo como parámetro a postsuper para que el trabajo sea más rápido (el ejemplo se ejecuta con una cuenta de correo, pero podríamos filtrar todo un dominio de la misma forma): 
 
# for i in `mailq | grep tequilasunrise270@liberotta.it | cut -f1 -d*`; do postsuper -d $i; done
postsuper: 769024147F2: removed
postsuper: Deleted: 1 message
postsuper: 93A4B415197: removed
postsuper: Deleted: 1 message
postsuper: BD9FC414BFB: removed
postsuper: Deleted: 1 message
postsuper: 024EF4150C2: removed
postsuper: Deleted: 1 message
postsuper: 12114414813: removed
postsuper: Deleted: 1 message
...
#
 
Otra opción que se me ocurre así a bote pronto es generar a partir de mailq una lista negra de direcciones spam y borrar todos los correos estén en cola y hagan referencia a ellas.

Empezamos creando un archivo con la lista de todas las direcciones de correos implicados en cola, por ejemplo:
# mailq | grep : | cut -f3 -d":" | cut -f3 -d" " | sort  > ~/mailq.log
# cat ~/mailq.log
14479TDJAR@rrew.com
1919@intl-error.mail.info
3F2ZB9R@barriage.com
4QC5TBFN4Y@rarnyne.net
5minnews.com@kingofthedirt.com
71V8V5@rarrgoico.net
7AP31N@rarrlolico.com
96ZEXFSXB@rarrisolidp.com
9DTOUY@rarrgoldmine.com
aalguien@server.com
Aprafivo69@abebooks.com
BenaeMilne@meiselania.cc
Boospq@123456.com
bueno@server.com
Casey.Wood@jermanyfromhome.net
DAVEY879@RUBIAZA.DE
dario@server.com
DKG40BZ@chickenstolen.de
...
 
Observamos que en mailq.log hay direcciones "buenas" y "malas", bien manualmente o con alguna otra operación que se nos ocurra podemos quedarnos solamente con las "malas" para pasarle a postsuper. Podríamos eliminar de una tacada las direcciones propias del servidor, convirtiendo el cribado en algo más sencillo: 
 
# cat mailq.log | grep -v server.com > mailq.log
 
Desde que tenemos el fichero con la lista de direcciones de correo "sobrante" podemos lanzar el siguiente comando, que buscará en mailq todas las referencias a esas cuentas, sacando el ID y procesándolo mediante postsuper:
 
# for i in `cat ~/mailq.log`; do `mailq | grep $i| cut -f1 -d* | postsuper -d -`; done
 
Una vez aplicados estos pequeños trucos la cola debería haberse limpiado bastante y lo que es más importante, en mucho menos tiempo que si vamos procesando los correos uno a uno.

Todo depende de las manos del administrador y de su capacidad de filtrado con las cuentas, pero realmente... ¿qué sistema no depende de un administrador?. Más sencillo sería un postsuper -d ALL aunque apuesto a que más de uno tendría cargo de conciencia.

sábado, 3 de agosto de 2013

IPTABLES: DEFICIONES BASICAS

}} Definiciones previas
:: Iptables trabaja con tres tablas:

  • INPUT: Para conexiones entrantes
  • OUTPUT: Para conxciones salientes
  • FORDWARD: Para reenvió de paquetes a la red
:: La operaciones que podemos realizar con IPTABLES son:
  • Crear una nueva cadena o tabla: iptables -N cadena (opciones)
  • Borrar una cadena: iptables -X cadena (opciones)
  • Modificar políticas para una cadena pre-armada: iptables -P cadena (opciones)
  • Listar las reglas de una cadena: iptables -L cadena (opciones)
  • Vaciar las reglas de una cadena: iptables -F cadena (opciones)
  • Resetear contadores de paquetes y bytes de todas las reglas de una cadena: iptables -Z cadena (opciones)
:: Comandos que manipulan reglas de cadenas:
  • Agregar un nueva regla a una cadena: -A
  • Insertar un nueva regla en cierta posición de una cadena: -I
  • Reemplazar una regla de cierta posición de una cadena: -R
  • Borrar una regla a cierta posición de un cadena: -D
  • Borrar la primer regla que se corresponde en una cadena: .D
:: Parámetros de estos comandos:
  • Destino de paquetes: -j acción (donde acción puede ser DROP, ACCEPT o el nombre de otra cadena definida por el usuario
  • Origen del paquete: -s IP[/BASE] (donde IP es una dirección 10.0.26.2 y /BASE puede ser la mascara de red expresada en CIDR osea 10.0.26.2/24, pero además /BASE puede ser otra dirección IP para definir un rango osea 10.0.26.2/10.0.26.24
  • Destino de Red de un paquete: -d IP[/BASE] (al igual que -s, con la diferencia que esta regla es para los paquetes generados en Nuetra red con destino IP[/BASE] )
  • Protocolo de un paquete: -p PROTOCOLO (icmp, udp, tcp, etc).
Todos estos parámetros además pueden contener el símbolo "!" el cual tiene un efecto el cual sera distinto al que especifiquemos, un ejemplo es: -s ! localhost es cualquier paquete que no venga de localhost.

}} Reglas para utilizarlo mas específicamente

:: Filtrar paquetes desde cierta IP
Hay dos cosas a tener en cuenta IP se debe remplazar por una dirección real y acción por DROP, lo cual hará que los paquetes a esa IP sean descartados , y la otra acción es ACCEPT, haciendo que los paquetes sean aceptados por nuestro firewall

 
iptables -A INPUT -s IP -j acción

 
:: Eliminar regla escrita
Cuando la regla creada ya deja de ser útil a nuestra conveniencia y queremos eliminarla debemos básicamente escribir lo mismo pero con la diferencia que en vez de la opción -A debemos usar -D

iptables -D INPUT -s IP -j acción

 
:: Filtrar paquetes hacia una IP

iptables -A OUTPUT -d IP -j acción

:: Filtrar el PING
iptables -D INPUT -p icmp -j DROP

:: Filtrar Port 139: NetBIOS Session (TCP), Windows File and Printer Sharing
ipables -A INPUT -i ppp0 -p TCP --dport 139 -j DROP

:: Filtrar TELNET: 
iptables -t filter -A INPUT -p all -s red_local -d mi_ip --dport 23 -j ACCEPT
iptables -t filter -A INPUT -p all -s 0/0 -d mi_ip --dport -j DROP


:: Filtrar NIS
iptables -t filter -A INPUT -p all -s red_local -d mi_ip --dport 111 -j ACCEPT
iptables -t filter -A INPUT -p all -s 0/0 -d mi_ip --dport 111 -j DROP


MYSQL: MANEJO DE USUARIOS II

ADMINISTRACION DE USUARIOS EN MYSQL

Hasta ahora hemos usado sólo el usuario 'root', que es el administrador, y
que dispone de todos los privilegios disponibles en MySQL.

Sin embargo, normalmente no será una buena práctica dejar que todos los
usuario con acceso al servidor tengan todos los privilegios. 

Para conservar la integridad de los datos y de las estructuras será conveniente que sólo algunos usuarios puedan realizar determinadas tareas, y que otras, que requieren mayor conocimiento sobre las estructuras de bases de datos y tablas, sólo puedan realizarse por un número limitado y controlado de usuarios.

Los conceptos de usuarios y privilegios están íntimamente relacionados. No se pueden crear usuarios sin asignarle al mismo tiempo privilegios. De hecho, la necesidad de crear usuarios está ligada a la necesidad de limitar las acciones que tales usuarios pueden llevar a caobo.

MySQL permite definir diferentes usuarios, y además, asignar a cada uno determinados privilegios en distintos niveles o categorías de ellos.

Niveles de privilegios

En MySQL existen cinco niveles distintos de privilegios:
Globales: se aplican al conjunto de todas las bases de datos en un servidor. Es el nivel más alto de privilegio, en el sentido de que su ámbito es el más general.
De base de datos: se refieren a bases de datos individuales, y por extensión, a todos los objetos que contiene cada base de datos. 
De tabla: se aplican a tablas individuales, y por lo tanto, a todas las columnas de esas tabla.
De columna: se aplican a una columna en una tabla concreta.
De rutina: se aplican a los procedimientos almacenados. 

Aún no hemos visto nada sobre este tema, pero en MySQL se pueden almacenar procedimietos consistentes en varias consultas SQL. 

Crear usuarios 

Aunque en la versión 5.0.2 de MySQL existe una sentencia para crear usuarios, CREATE USER, en versiones anteriores se usa exclusivamente la sentencia GRANT para crearlos.

En general es preferible usar GRANT, ya que si se crea un usuario mediante CREATE USER, posteriormente hay que usar una sentencia GRANT para concederle privilegios.
Usando GRANT podemos crear un usuario y al mismo tiempo concederle también los
privilegios que tendrá. La sintaxis simplificada que usaremos para GRANT, sin preocuparnos de temas de cifrados seguros que dejaremos ese tema para capítulos avanzados, es:
 
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
    ON {tbl_name  *  *.*  db_name.*}
    TO user [IDENTIFIED BY [PASSWORD] 'password']
        [, user [IDENTIFIED BY [PASSWORD] 'password']] ...

La primera parte priv_type [(column_list)] permite definir el tipo de privilegio concedido para determinadas columnas. La segunda ON {tbl_name * *.* db_name.*}, permite conceder privilegios en niveles globales, de base de datos o de tablas.

Para crear un usuario sin privilegios usaremos la sentencia:
 
mysql>; GRANT USAGE ON *.* TO anonimo IDENTIFIED BY 'clave';
Query OK, 0 rows affected (0.02 sec)

Hay que tener en cuenta que la constraseña se debe introducir entre comillas
de forma obligatoria.

Un usuario 'anonimo' podrá abrir una sesión MySQL mediante una orden:
 
C:\mysql -h localhost -u anonimo -p

Pero no podrá hacer mucho más, ya que no tiene privilegios. No tendrá, por
ejemplo, oportunidad de hacer selecciones de datos, de crear bases de datos o
tablas, insertar datos, etc. 

Conceder privilegios

Para que un usuario pueda hacer algo más que consultar algunas variables del
sistema debe tener algún privilegio. Lo más simple es conceder el privilegio
para seleccionar datos de una tabla concreta. Esto se haría así:

La misma sentencia GRANT se usa para añadir privilegios a un usuario existente.


mysql> GRANT SELECT ON prueba.gente TO anonimo;
Query OK, 0 rows affected (0.02 sec)

Esta sentencia concede al usuario 'anonimo' el privilegio de ejecutar
sentencias SELECT sobre la tabla 'gente' de la base de datos 'prueba'.
Un usuario que abra una sesión y se identifique como 'anonimo' podrá ejecutar
estas sentencias:

mysql> SHOW DATABASES;
+----------+
 Database 
+----------+
 prueba   
+----------+
1 row in set (0.01 sec)


mysql> USE prueba;
Database changed


mysql> SHOW TABLES;
+------------------+
 Tables_in_prueba 
+------------------+
 gente            
+------------------+
1 row in set (0.00 sec)


mysql> SELECT * FROM gente;
+----------+------------+
 nombre    fecha      
+----------+------------+
 Fulano    1985-04-12 
 Mengano   1978-06-15 
 Tulano    2001-12-02 
 Pegano    1993-02-10 
 Pimplano  1978-06-15 
 Frutano   1985-04-12 
+----------+------------+
6 rows in set (0.05 sec)


mysql>
 
Como se ve, para este usuario sólo existe la base de datos 'prueba' y dentro de esta, la tabla 'gente'. Además, podrá hacer consultas sobre esa tabla, pero
no podrá añadir ni modificar datos, ni por supuesto, crear o destruir tablas ni bases de datos.

Para conceder privilegios globales se usa ON *.*, para indicar que los privilegios se conceden en todas las tablas de todas las bases de datos.

Para conceder privilegios en bases de datos se usa ON nombre_db.*, indicando que los privilegios se conceden sobre todas las tablas de la base de datos 'nombre_db'.

Usando ON nombre_db.nombre_tabla, concedemos privilegios de nivel de tabla para la tabla y base de datos especificada.

En cuanto a los privilegios de columna, para concederlos se usa la sintaxis
tipo_privilegio (lista_de_columnas), [tipo_privilegio (lista_de_columnas)].

Otros privilegios que se pueden conceder son:
  • ALL: para conceder todos los privilegios.
  • CREATE: permite crear nuevas tablas.
  • DELETE: permite usar la sentencia DELETE.
  • DROP: permite borrar tablas.
  • INSERT: permite insertar datos en tablas.
  • UPDATE: permite usar la sentencia UPDATE

Para ver una lista de todos los privilegios existentes consultar la sintaxis de la sentencia GRANT.

Se pueden conceder varios privilegios en una única sentencia. Por ejemplo:

mysql> GRANT SELECT, UPDATE ON prueba.gente TO anonimo IDENTIFIED BY 'clave';
Query OK, 0 rows affected (0.22 sec)
mysql>

Un detalle importante es que para crear usuarios se debe tener el privilegio GRANT OPTION, y que sólo se pueden conceder privilegios que se posean.  

Revocar privilegios

Para revocar privilegios se usa la sentencia REVOKE.

REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
    ON {tbl_name  *  *.*  db_name.*}
    FROM user [, user] ...
 
La sintaxis es similar a la de GRANT, por ejemplo, para revocar el privilegio SELECT de nuestro usuario 'anonimo', usaremos la sentencia:
mysql> REVOKE SELECT ON prueba.gente FROM anonimo;
Query OK, 0 rows affected (0.05 sec) 
 
Mostrar los privilegios de un usuario 
 
Podemos ver qué privilegios se han concedido a un usuario mediante la
sentencia SHOW GRANTS. La salida de esta sentencia es una lista de sentencias
GRANT que se deben ejecutar para conceder los privilegios que tiene el
usuario. Por ejemplo:
mysql> SHOW GRANTS FOR anonimo;
+--------------------------------------------------------------------+
 Grants for anonimo@%                                               
+--------------------------------------------------------------------+
 GRANT USAGE ON *.* TO 'anonimo'@'%' IDENTIFIED BY PASSWORD '*5...' 
 GRANT SELECT ON `prueba`.`gente` TO 'anonimo'@'%'                  
+--------------------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> 

Nombres de usuarios y contraseñas

Como podemos ver por la salida de la sentencia SHOW GRANTS, el nombre de usuario no se limita a un nombre simple, sino que tiene dos partes. La primera consiste en un nombre de usuario, en nuestro ejemplo 'anonimo'. La segunda parte, que aparece separada de la primera por el carácter '@' es un nombre de máquina (host). 

Este nombre puede ser bien el de una máquina, por ejemplo, 'localhost' para referirse al ordenador local, o cualquier otro nombre, o bien una ip.

La parte de la máquina es opcional, y si como en nuestro caso, no se pone, el
usuario podrá conectarse desde cualquier máquina. 

La salida de SHOW GRANTS lo indica usando el comodín '%' para el nombre de la máquina.

Si creamos un usuario para una máquina o conjunto de máquinas determinado,
ese usuario no podrá conectar desde otras máquinas. Por ejemplo:
mysql> GRANT USAGE ON * TO anonimo@localhost IDENTIFIED BY 'clave';
Query OK, 0 rows affected (0.00 sec)

Un usuario que se identifique como 'anonimo' sólo podrá entrar desde el mismo
ordenador donde se está ejecutando el servidor. En este otro ejemplo:
mysql> GRANT USAGE ON * TO anonimo@10.28.56.15 IDENTIFIED BY 'clave';
Query OK, 0 rows affected (0.00 sec)

El usuario 'anonimo' sólo puede conectarse desde un ordenador cuyo IP sea '10.28.56.15'. Aunque asignar una constraseña es opcional, por motivos de seguridad es recomendable asignar siempre una.

La contraseña se puede escribir entre comillas simples cuando se crea un usuario, o se puede usar la salida de la función PASSWORD() de forma literal, para evitar enviar la clave en texto legible.

Si al añadir privilegios se usar una clave diferente en la cláusula IDENTIFIED BY, sencillamente se sustituye la contraseña por la nueva. 

Borrar usuarios 

Para eliminar usuarios se usa la sentencia DROP USER.
No se puede eliminar un usuario que tenga privilegios, por ejemplo:
mysql> DROP USER anonimo;
ERROR 1268 (HY000): Can't drop one or more of the requested users
mysql>

Para eliminar el usuario primero hay que revocar todos sus privilegios:

mysql> SHOW GRANTS FOR anonimo;
+--------------------------------------------------------------------+
 Grants for anonimo@%                                               
+--------------------------------------------------------------------+
 GRANT USAGE ON *.* TO 'anonimo'@'%' IDENTIFIED BY PASSWORD '*5...' 
 GRANT SELECT ON `prueba`.`gente` TO 'anonimo'@'%'                  
+--------------------------------------------------------------------+
2 rows in set (0.00 sec)


mysql> REVOKE SELECT ON prueba.gente FROM anonimo;
Query OK, 0 rows affected (0.00 sec)

mysql> DROP USER anonimo;
Query OK, 0 rows affected (0.00 sec)
mysql>