Saltar a contenido

Linux

Mastering Squid - Instalación

¡Bievenido al Mastering en Squid! Este es un curso extendido sobre cómo utilizar Squid dividido en varios posts para facilitar la lectura y ser más organizados. Advertimos que va a ser un curso bastante largo, y que puedana provecharlo al máximo. Disfruten del primer post, la instalación.

Squid logo

¿Qué es un proxy?

Es un software que permite facilitar la comunicación entre un cliente y un servidor sin modificar peticiones o respuestas. Cuando nosotros iniciamos una petición hacia una fuente para obtener algo, el proxy lo que hace es "secuestrar" esa conexión y representarse así mismo como un cliente de cara al servidor. Una vez devuelta la respuesta, esta llega al proxy y depende de sus políticas, esos datos quedan guardadados o se borran, y posteriormente se envía al cliente que solicitó los datos desde el principio.

Por lo tanto, actúa también como un potente filtro de peticiones basado en una serie de reglas que validen o no las peticiones que se vayan a realizar. Si por ejemplo, intentamos entrar a chachacha.com, y resulta que en la configuración del proxy se nos deniega el acceso, evidentemente, el proxy nos betará la conexión a dicha página con lo que se mejora la seguridad de la red mediante esta serie de políticas. También incrementa la defensa contra virus o malware ya que al analizar el tráfico puede ver si los sitios son o no de confianza.

Y no sólo por filtra el tráfico evitando que usuarios X accedan a sitios que no deben, o porque el proxy tiene una IP y la usaremos en vez de relevar la nuestra (en caso de ser remoto), también es útil, porque la información que solicitamos se almacena haciendo un "caching" permitiéndonos no tener que volver a descargar todo el contenido de una página Web, con lo que hace el acceso más rápido y reduciendo el consumo ancho de banda. Además, esto permite visualizar el tráfico que se está enviando y recibiendo, y si el consumo de ancho de banda es elevado, podemos darle un toque a los usuarios de que se están pasando de la ralla.

Y por último, si tenemos un servidor Web al que accede constantemente a CDNs para obtener documentos, imágenes, frameworks basados en JS, CSS3, HTML...etc, puede mantener todo almacenado y evitar incrementar el ancho de banda por petición, con lo que mejora el propio rendimiento del servidor web.

¿Qué es un proxy inverso?

Es una técnica que permite almacenar los archivos que se obtienen de CDN o de otros sitios remotos para almacenarlos en el servidor web local, con lo que, como hemos dicho anteriormente, aprovechar el ancho de banda para otros servicios de la red, gestionar bien el espacio de almacenamiento y evitar problemas de sobrecarga en el servidor.

Esta técnica es muy útil principalmente por el ahorro de ancho de banda, y como consecuencia, los clientes que se conecten al servidor web evitaran tener que enviar muchas peticiones a multitud de sitios (CDN mayormente) para obtener librerías JS, estilos CSS3...etc, ya que está almacenado en el proxy permitiendo reducir su gasto en datos móviles.

Instalando Squid

En este apartado, encontraremos los pasos para poder instalar Squid en nuestra distribución, sistema. También incluimos los pasos de cómo compilar Squid en caso de que las características que busquemos no formen parte de los binarios pre-compilados.

Fedora

Para instalar Squid en Fedora, tan solo tenemos que ejecutar:

$ su -c "dnf install squid"

Archlinux

En esta fantástica distro:

$ sudo pacman -S squid

Que se encuentra en los repositorios "Community"

Ubuntu/Debian

Corremos en una terminal:

$ sudo apt-get install squid

openSUSE

Tan sencillo cómo:

$ sudo zypper in squid

CentOS / RHEL

$ sudo yum install squid

NOTA: Si ya tienes instalado Squid, es mejor que te saltes el siguiente punto.

Compilando

En otras distribuciones que no mencionamos, siempre es mejor utilizar las fuentes oficiales, en caso de que no sea posible o que queramos tener ciertas caracterísiticas habilitadas, tendremos que compilar.

  1. Descargar el archivo fuente
  2. Instalar dependencias necesarias para compilar el paquete
  3. Configurar las opciones de compilación
  4. Compilar e instalar
  5. Probar

Descargamos el tarball desde el siguiente enlace, lo descomprimimos y nos situamos en el directorio mediante una terminal.

Configurando las opciones de compilación

Aquí tenemos un listado enorme explicando un poco las opciones que podemos configurar en Squid:

--prefix=DIR

Como no, definimos el directorio dónde lo queremos instalar.

--enable-gnuregex

Esta característica permite habilitar las expresiones regulares cuando se construyen listas de control de acceso en Squid. En principio no hace falta habilitarlo, solo en aquellos sistemas que no soporten expresiones regulares.

--disable-inline

Cuando compilamos Squid por defecto, lo hace todo en línea y esto conlleva compilar todo el código. Sin embargo, si queremos que el proceso sea veloz pero para usarlo en un entorno de pruebas, podemos utilizar esta opción.

--disable-optimizations

Squid se compila por defecto con optimizaciones para generar un binario con mayor rendimiento. Esta opción al igual que la anterior es mejor dejarla solo para casos en desarrollo o pruebas.

--enable-storeio

Cuánto más rápido Squid pueda leer/escribir archivo desde caché, menos tardará en satisfacer una solicitud dando menos retrasos. Existen diferentes técnicas que permiten obtener un rendimiento más optimizado según el tipo de tráfico y el uso. Podemos construir Squid con varios tipos de módulos de almacenamiento de entrada/salida.

Podemos echarle un bitstazo a los módulos soportados ubicados en el directorio src/fs del código fuente de Squid.

--enable-removal-policies

Squid al estar almacenando páginas o documentos que se descargan cuando navegamos, es lógico que cada cierto tiempo tenga problemas con el espacio que hemos especificado y por lo tanto, necesitará más espacio. Squid decide que hacer con los archivos viejos si deberían eliminarse o limpiarlos para obtener más espacio y almacenar nuevos archivos. Hay diferentes políticas para limpiar los documentos almacenados en caché para obtener un mejor rendimiento.

Las políticas están basadas en heap (basadas en montículos, estructura de árbol de datos) y/o en listas de datos estructurados. Las listas de datos estructurados están habilitadas por defecto. Podemos comprobar en el código fuente src/repl/ las políticas disponibles.

--enable-icmp

La habilitamos sÓlo si utilizamos otras soluciones que almacenen datos en caché, ya que permiten determinar latencia entre ellas.

--enable-delay-pools

Permite limitar el ancho de banda de la red para que no se congestione. Es útil cuando tenemos un grupo de usuarios que efectúan multitud de operaciones sobre cuando descargan archivos que suelen saturar completamente el tráfico. Squid hace uso de unos "espacios de retardo", filtra el tráfico y reduce la velocidad para que no se utilice todo el ancho de banda disponible.

--enable-esi

Permite a Squid utilizar Edge Side, un tipo de lenguaje de marrcas para definir los componentes de una página web para construirlos de forma dinámica y hacerlos llegar a las aplicaciones web en el borde de Internet. Si se habilita, Squid ignorará el control de almacenamiento por cabecera desde los clientes. Esta opción solo interesa si está en modo acelerador.

--enable-useragent-log

Permite registrar qué tipo de navegador está utilizando

--enable-referer-log

Squid podrá escribir un campo de encabezado de referencia en solicitudes HTTP

--disable-wccp

Esta opción deshabilita la compatibilidad con el protocolo (WCCP) de comunicaciones de servidores de almacenamiento en caché Web de Cisco. Permite la comunicación entre cachés y a su vez, ayuda a localizar el tráfico. Por defecto, está habilitada.

--disable-wccpv2

Deshabilita la versión 2 del protocolo anterior. Este es una versión mejorada que permite balanceo de carga, escalamiento, tolerancia a fallos, y un servicio con mecanismos de garantías. Por defecto está habilitado.

--disable-snmp

Simple Network Management Protocol (SNMP) está habilitado por defecto y lo suelen utilizar los administradores de sistemas para monitorizar servidores o dispositivos de red como switches o routers.

--enable-cachemgr-hostname

El gestor de Caché (cachemgr.cgi) es una utilidad elaborada en CGI para gestionar la caché de Squid, también permite ver las estadísticas a través de un portal web. Por defecto podemos acceder al portal web mediante localhost o la IP de nuestro Squid.

--enable-arp-acl

Squid soporta la construcción de Listas de Control de Acceso por dirección MAC o Ethernet. Esta característica está deshabilitada por defecto. Si queremos controlar el acceso a los clientes basándonos en direcciones Ethernet, tenemos que habilitar esta características.

--disable-htcp

El protocolo HTCP (Hypertext Caching Protocol) puede utilizarlo Squid para enviar y recibir actualizaciones periódicas de software que almacene en caché. Esta opción deshabilita.

--enable-ssl

Squid pueden terminar con las conexiones SSL. Cuando se configura Squid en modo inverso, puede terminar con las conexiones SSL que hayan iniciado los clientes y manejarlas en nombre del servidor web en el back-end. Eso quiere decir, que el servidor Web en el backend como Apache con PHP, NGINX... no tiene que hacer trabajos de SSL, por lo que la conexión entre servidor web-Squid será en HTTP limpio, mientras que los clientes verán que acceden en modo seguro. Solo es útil si está configurado en modo inverso o en modo acelerador.

--enable-cache-digests

Los resúmenes periódicos es la manera que tiene Squid para compartir información con otros servidores Squid acerca de los documentos web, en un formato comprimido.

--enable-default-err-language

Cuando no se puede acceder a una determinada página ya sea porque ha obtenido un error 404, o 503... Squid utiliza páginas predeterminadas para mostrar dichos errores en el idioma X. Por defecto son inglesas.

--enable-err-languages

Por defecto, Squid se compila con soporte a múltiples idiomas. Si solo queremos utilizar algunos, o uno en cuestión, podemos definirlo aquí.

--disable-http-violations

Deshabilitar las violaciones del protocolo HTTP, no permitir X los paquetes con la cabecera modificada se acepten por Squid.

--enable-linux-netfilter

Netfilter es un framework de filtrado de paquetes que apareció en los kernels 2.4.x y 2.6.x. Esta opción solo es útil si utilizamos un proxy transparente en sistemas Linux.

--enable-follow-x-forwarder-for

Cuando Squid envía una solicitud HTTP, Squid rellena con su IP el encabezado, sin embargo, añade información sobre el cliente para que se pueda encontrar si se usan más servidores proxy.

--disable-ident-lookups

Evita que Squid busque las identidades de los clientes, sin embargo, esto puede causar un DoS (Denial Of Service) si un cliente hace muchas peticiones largas de conexiones.

--disable-internal-dns

Deshabilitamos su propio sistema de Dirección de Resolución de Nombres, y utilizar DNS externos.

--enable-default-hostfile

Seleccionamos la ruta por defecto del fichero /etc/hosts(5)

--enable-auth

Provee de mecanismos de autenticación.

Sintaxis vieja

Habilitar sistemas de autenticación:

./configure --enable-auth=basic,digest,ntlm

Nueva sintaxis La sintaxis que vamos a ver ahora es para seleccionar el esquema de autenticación que queremos utilizar. En este apartado hay programas de autenticación externos que nos pueden ayudar durante el proceso.

--enable-auth-basic

Habilita la compatibilidad con un esquema de autenticación básica y construye listas de software específicos necesarios en la compilación. Si la lista de software no se provee, habilitará por defecto todos los software. Hay una lista que contiene todos ellos en helpers/basic_auth Para deshabilitar esta opción: --disable-auth-basic

Si no queremos habilitar esta opción, pero no queremos compilar ningún ayudante, utilizamos "none".

--enable-auth-ntlm

Squid soporta el esquema de autenticación llamado NTLM. Los ayudantes para este esquema específico reside en el directorio helpers/ntlm_auth Para deshabilitarlo: --disable-auth-ntlm

--enable-auth-negotiate

Esta opción permite utilizar un esquema de negociación.

--enable-auth-digest

Permite utilizar el esquema de autenticación de resumen.

--enable-ntlm-fail-open

Permite a un ayudante fallar en el proceso de autenticación de un usuario. Es mejor que no utilicemos esta opción según la documentación.

--enable-external-acl-helpers

Permite utilizar listas de control de acceso externas. Las podemos encontrar aquí helpers/external_acl

--disable-translation

Deshabilita que se muestren páginas de error en el idioma local.

--disable-auto-locale

Se basa en la cabecera de peticiones en un cliente. Squid intenta de forma automática proveer de una página de error con el idioma local. Esto lo deshabilita.

--disable-unlinkd

Deshabilita el soporte unlinkd No es buena idea si se queda bloqueado el software.

--with-default-user

Squid corre por defecto como usuario nobody . Podemos seleccionar con que usuario correrlo.

--with-logdir

Squid almacena los logs en /var/log/squid, aquí podemos modificar la ruta de almacenado.

--with-pidfile

Modifica la ruta en la que se almacenará el .pid

--with-aufs-threads

Definimos el número de hilos que queremos que utilice el sistema de almacenamiento en caché llamado aufs. No se suele utilizar esta opción, Squid ya lo calcula.

--without-pthreads

Las versiones más viejas se compilan sin el soporte paralelo de POSIX. Por defecto las nuevas versiones se compilan con pthreads por defecto.

--with-openssl

Si queremos construir Squid con soporte OpenSSL, podemos utilizar esta opción:

--with-large-files

Squid registra todo y los ficheros de /var/log/ especialmente los de acceso, crecen muy deprisa. Esto permite soportar los archivos pesados.

--with-filedescriptors

Los sistemas operativos utilizan descriptores de ficheros (números enteros) para seguirle la pista a los ficheros y sockets que estén abiertos. Por defecto, el límite en las conexiones normalmente es 2014. Una vez que Squid tiene conexiones aceptadas que tienen consumido todos los ficheros descriptores disponibles para el usuario Squid, no puede aceptar más conexiones si no cuando se liberen más ficheros descriptores.

Para saber qué límite tenemos:

ulimit -n

Para añadir más, hay que añadir las siguientes líneas: /etc/security/limits.conf(5)

username hard nofile 8192
username soft nofile 8192

Aplicando opciones de configuración

Una vez que tengamos nuestra lista de características, procedemos a aplicarlas en la fase de pre-compilado.

./configure --prefix=/usr --disable-wccp --disable-wccpv2 --disable-snmp --enable-arp-acl --disable-htcp --enable-ssl --enable-cache-digests --enable-default-err-language=Spanish --enable-linux-netfliter --disable-ident-lookups --disable-internal-dns --enable-default-hostsfile --with-default-user=squid --with-openssl --with-large-files

Compilamos e instalamos

Básicamente efectuaremos la compilación de squid(8)

NOTA: Podemos hacer uso de los hilos para que la compilación vaya más rápida make -jN dónde N, va el número total de núcleos + hilos, ejemplo 2 núclos, 4 hilos = make -j6

$ make && sudo make install clean

Y ya lo tendremos instalado en nuestro sistema.

Crear el servicio

Creamos un nuevo archivo en /etc/systemd/system/squid.service con el siguiente contenido:

[Unit]
Description=Squid
After=network.target

[Service]
ExecStartPre=/usr/libexec/squid/cache_swap.sh
ExecStart=/usr/sbin/squid -f /etc/squid/squid.conf
ExecReload=/usr/sbin/squid -k reconfigure -f /etc/squid/squid.conf
ExecStop=/usr/sbin/squid -k shutdown -f /etc/squid/squid.conf

NOTA: Sustituimos los directorios /usr... por aquel dónde se instaló.

Gestionando el servicio

Iniciar el servicio temporalmente:

$ sudo systemctl start squid.service

Parar el servicio momentáneamente:

$ sudo systemctl start squid.service

Reiniciar Squid:

$ sudo systemctl restart squid.service

Habilitar Squid al inicio:

$ sudo systemctl enable squid.service

Deshabilitar el servicio:

$ sudo systemctl disable squid.service

Gestionando el firewall con FW

Para permitir las conexiones al proxy de forma temporal en firewalld(1) bastará con ejecutar:

$ sudo firewall-cmd --add-port 3128/tcp --zone=public

Permitir conexiones de forma permanente:

$ sudo firewall-cmd --add-port 3128/tcp --zone=public --permanent

Para eliminar la apertura del puerto de forma temporal

$ sudo firewall-cmd --remove-port 3128/tcp --zone=public

Eliminarlo de forma permanente

$ sudo firewall-cmd --remove-port 3128/tcp --zone=public --permanent

Eso es todo

Windows

Existe una versión portada para Windows elaborada por un tercero, una empresa llamada Diladele BV, ubicada en Amsterdam. Se puede obtener desde aquí. NOTA: Si encontramos algún fallo en el instalador, podemos reportarlo a través de este git

Instalando

Una vez descargado, lo instalamos y seguimos los pasos a continuación.

[owl-carousel items=1 margin=10 loop=true autoplay=true autoplayHoverPause=true nav=true] [/owl-carousel]

Configuración, puertos y más

Podemos ver en el escritorio cómo se nos han creado 2 iconos de escritorio relacionados con Squid. "Squid Console" y "Squid Server Tray", el primero nos permite interactuar con el servidor a través de una cmd.exe y el segundo, nos permite arrancar el servidor en modo silencioso, es decir, minimizado en el área de notificación o bandeja del sistema.

Si hacemos clic derecho en el icono de Squid en la bandeja del sistema, tendremos una serie de opciones como: * Editar el fichero de configuración * Ver la carpeta de Squid * Iniciar el servicio * Parar el servicio * Acerca de * Salir

[owl-carousel items=1 margin=10 loop=true autoplay=true autoplayHoverPause=true nav=true] Iconos creados por el instalador de Squid Directorio de instalación Archivo de configuración [/owl-carousel]

Tenemos que revisar que Squid arranca como servicio en Windows, para ello hay que ejecutar el programa services.msc y mirar las propiedades de "Squid" tal y como se muestra en la siguiente imagen:

Squid services.msc

Por defecto Squid utiliza el puerto 3128, por ende, tenemos que habilitarlo en el firewall de Windows "Inicio-> En el buscador escribimos-> Firewall Windows". FW Básico de Windows

Si queremos modificar el puerto por defecto, tendremos que editar el fichero de configuración de Squid que se encuentra en C:\Squid\etc\squid.conf, en la directiva

Port 3128

Cambiarla por el puerto que queramos, y posteriormente, tenemos que dirigirnos a "Inicio -> Buscar Configuración avanzada del FW Windows -> Reglas de entrada -> Modificar Squid Cache Server" y poner el puerto que queramos, tal y como se ve en la imagen.

Configurando el puerto

Posteriormente, reiniciamos el servidor Squid desde la bandeja del sistema y ya tendremos Squid funcionando con el nuevo puerto que le hemos asignado.

Referencias

Mastering Squid - ACL

Bienvenid@s a la segunda parte de este "Mastering in Squid", en esta parte del curso, os explicaremos qué son las listas de control de acceso una parte de las directivas de Squid, para qué se utilizan y cómo utilizarlas, no nos lo podemos perder.

¿Qué son las ACL?

Las ACL (Access Control List) o en español Listas de Control de Acceso es un concepto de seguridad informática que utiliza para fomentar la separación de privilegios, en nuestro caso, ayudará a separar url, ips o nombres de máquinas para posteriormente hacer algo con ellas, como por ejemplo, en un instituo, permitir el acceso a redes sociales a los profesores, pero no a los ordenadores de los alumnos...

¿Cómo definimos las ACL?

Existen dos tipos de sintaxis, en línea o apuntando a un archivo. * En línea: Es más cómodo cuando apuntamos 2,3 datos, más se puede volver ilegible y engorroso.

acl nombre_de_lista tipo_acl dato1 dato2 dato3
  • Apuntando a un archivo: Se utiliza cuando apuntamos más de 3 datos, se permiten comentarios.

    acl nomnre_de_lista tipo_acl "/DIRECTORIO/ARCHIVO"

¿Qué tipos de ACL tenemos?

Tenemos multitud de ellos como:

  • arp [DIRECCION_MAC]: Crea una ACL con una o varias dirección(es) MAC.
  • _Notas:
    • No funciona con todos los sistemas operativos, según la documentación trabaja correctamente con Linux, Solaris, Windows, FreeBSD y otras variantes de BSD.
    • Squid solo puede determinar la dirección MAC/EUI para clientes IPv4 que se encuentren en la misma subred, si están en otras subredes Squid no puede reconocer qué equipo es.
    • El protocolo IPv6 no contiene ARP, se utiliza ND (Neighbor Discovery) que es parecido, con lo que esta directiva no funciona para IPv6._
  • clientside mark[/mask] -Esta aplicación hay que investigarla
  • srcdomain .google.es: Permite definir un dominio o dirección IP/direcciones origen
  • dstdomain dirección_destino: Puede ser una url, ip o conjunto de direcciones ips.
  • srcdom_regex \.google\.*: Igual que srdomain pero con la opción de usar expresiones regulares.
  • dstdom_regex \.google\.*: Especifica dirección destino haciendo uso de expresiones regulares.
    • src_as number
    • dst_as number
  • time [DIA DE LA SEMANA] [HORA1]-[HORA2]: Establece un periodo de conexión:
    • Se define la semana como:
      • M -> Lunes
      • T -> Martes
      • W -> Miércoles
      • H -> Jueves
      • F -> Viernes
      • A -> Sábado
    • Se define la HORA1 y HORA2 como: hh:mm
  • url_regex ^http://: Permite bloquear urls haciendo uso de expresiones regulares.
  • urllogin [^a-zA-Z0-9]: Busca una expresión regular que coincida con un campo login
  • urlpath_regex \.exe(\?.*)?$: Encuentra un directorio y permite filtrar contenido
  • port 80 70 120: Permite definir un puerto o varios, se permiten rangos destino TCP
  • localport 3128: Puerto de cliente TCP conectado a
  • myportname 3128: Refleja si los detalles de conexión TCP equivalen al puerto declarado en el fichero de configuración de Squid.
  • proto HTTP FTP...: Se pueden bloquear protocolos como FTP para que no se pueda acceder.
  • method GET PUT POST: Especifica si se puede utilizar o no los métodos de solicitud del protocolo HTTP.
  • http_status 404 200: Especifica el código de respuesta del servidor
  • browser Mozilla: Especifica el navegador al que bloquear o no, se identifica mediante el UserAgent.
  • referer_regex regexp: Permite encontrar un patrón relacionado con la expresión regular que definimos, es muy difícil de aplicar, por lo que hay que tener cuidado.
  • ident cadena: Busca una cadena
  • ident_regex patrón: Busca una cadena relacionada con lo declarado.
  • acl aclname proxy_auth [-i] username: ... acl aclname proxy_auth_regex [-i] pattern ... # perform http authentication challenge to the client and match against # supplied credentials [slow] # # takes a list of allowed usernames. # use REQUIRED to accept any valid username. # # Will use proxy authentication in forward-proxy scenarios, and plain # http authenticaiton in reverse-proxy scenarios # # NOTE: when a Proxy-Authentication header is sent but it is not # needed during ACL checking the username is NOT logged # in access.log. # # NOTE: proxy_auth requires a EXTERNAL authentication program # to check username/password combinations (see # auth_param directive). # # NOTE: proxy_auth can't be used in a transparent/intercepting proxy # as the browser needs to be configured for using a proxy in order # to respond to proxy authentication.

    acl aclname snmp_community string ... # A community string to limit access to your SNMP Agent [fast] # Example: # # acl snmppublic snmp_community public

    acl aclname maxconn number # This will be matched when the client's IP address has # more than TCP connections established. [fast] # NOTE: This only measures direct TCP links so X-Forwarded-For # indirect clients are not counted.

    acl aclname max_user_ip [-s] number # This will be matched when the user attempts to log in from more # than different ip addresses. The authenticate_ip_ttl # parameter controls the timeout on the ip entries. [fast] # If -s is specified the limit is strict, denying browsing # from any further IP addresses until the ttl has expired. Without # -s Squid will just annoy the user by "randomly" denying requests. # (the counter is reset each time the limit is reached and a # request is denied) # NOTE: in acceleration mode or where there is mesh of child proxies, # clients may appear to come from multiple addresses if they are # going through proxy farms, so a limit of 1 may cause user problems.

    acl aclname random probability # Pseudo-randomly match requests. Based on the probability given. # Probability may be written as a decimal (0.333), fraction (1/3) # or ratio of matches:non-matches (3:5).

    acl aclname req_mime_type [-i] mime-type ... # regex match against the mime type of the request generated # by the client. Can be used to detect file upload or some # types HTTP tunneling requests [fast] # NOTE: This does NOT match the reply. You cannot use this # to match the returned file type.

    acl aclname req_header header-name [-i] any.regex.here # regex match against any of the known request headers. May be # thought of as a superset of "browser", "referer" and "mime-type" # ACL [fast]

    acl aclname rep_mime_type [-i] mime-type ... # regex match against the mime type of the reply received by # squid. Can be used to detect file download or some # types HTTP tunneling requests. [fast] # NOTE: This has no effect in http_access rules. It only has # effect in rules that affect the reply data stream such as # http_reply_access.

    acl aclname rep_header header-name [-i] any.regex.here # regex match against any of the known reply headers. May be # thought of as a superset of "browser", "referer" and "mime-type" # ACLs [fast]

    acl aclname external class_name [arguments...] # external ACL lookup via a helper class defined by the # external_acl_type directive [slow]

    acl aclname user_cert attribute values... # match against attributes in a user SSL certificate # attribute is one of DN/C/O/CN/L/ST or a numerical OID [fast]

    acl aclname ca_cert attribute values... # match against attributes a users issuing CA SSL certificate # attribute is one of DN/C/O/CN/L/ST or a numerical OID [fast]

    acl aclname ext_user username ... acl aclname ext_user_regex [-i] pattern ... # string match on username returned by external acl helper [slow] # use REQUIRED to accept any non-null user name.

    acl aclname tag tagvalue ... # string match on tag returned by external acl helper [fast] # DEPRECATED. Only the first tag will match with this ACL. # Use the 'note' ACL instead for handling multiple tag values.

    acl aclname hier_code codename ... # string match against squid hierarchy code(s); [fast] # e.g., DIRECT, PARENT_HIT, NONE, etc. # # NOTE: This has no effect in http_access rules. It only has # effect in rules that affect the reply data stream such as # http_reply_access.

    acl aclname note [-m[=delimiters]] name [value ...] # match transaction annotation [fast] # Without values, matches any annotation with a given name. # With value(s), matches any annotation with a given name that # also has one of the given values. # If the -m flag is used, then the value of the named # annotation is interpreted as a list of tokens, and the ACL # matches individual name=token pairs rather than whole # name=value pairs. See "ACL Options" above for more info. # Annotation sources include note and adaptation_meta directives # as well as helper and eCAP responses.

    acl aclname adaptation_service service ... # Matches the name of any icap_service, ecap_service, # adaptation_service_set, or adaptation_service_chain that Squid # has used (or attempted to use) for the master transaction. # This ACL must be defined after the corresponding adaptation # service is named in squid.conf. This ACL is usable with # adaptation_meta because it starts matching immediately after # the service has been selected for adaptation.

    acl aclname transaction_initiator initiator ... # Matches transaction's initiator [fast] # # Supported initiators are: # esi: matches transactions fetching ESI resources # certificate-fetching: matches transactions fetching # a missing intermediate TLS certificate # cache-digest: matches transactions fetching Cache Digests # from a cache_peer # htcp: matches HTCP requests from peers # icp: matches ICP requests to peers # icmp: matches ICMP RTT database (NetDB) requests to peers # asn: matches asns db requests # internal: matches any of the above # client: matches transactions containing an HTTP or FTP # client request received at a Squid *_port # all: matches any transaction, including internal transactions # without a configurable initiator and hopefully rare # transactions without a known-to-Squid initiator # # Multiple initiators are ORed.

    acl aclname has component # matches a transaction "component" [fast] # # Supported transaction components are: # request: transaction has a request header (at least) # response: transaction has a response header (at least) # ALE: transaction has an internally-generated Access Log Entry # structure; bugs notwithstanding, all transaction have it # # For example, the following configuration helps when dealing with HTTP # clients that close connections without sending a request header: # # acl hasRequest has request # acl logMe note important_transaction # # avoid "logMe ACL is used in context without an HTTP request" warnings # access_log ... logformat=detailed hasRequest logMe # # log request-less transactions, instead of ignoring them # access_log ... logformat=brief !hasRequest # # Multiple components are not supported for one "acl" rule, but # can be specified (and are ORed) using multiple same-name rules: # # # OK, this strange logging daemon needs request or response, # # but can work without either a request or a response: # acl hasWhatMyLoggingDaemonNeeds has request # acl hasWhatMyLoggingDaemonNeeds has response

IF USE_OPENSSL acl aclname ssl_error errorname # match against SSL certificate validation error [fast] # # For valid error names see in /usr/local/squid/share/errors/templates/error-details.txt # template file. # # The following can be used as shortcuts for certificate properties: # [ssl::]certHasExpired: the "not after" field is in the past # [ssl::]certNotYetValid: the "not before" field is in the future # [ssl::]certUntrusted: The certificate issuer is not to be trusted. # [ssl::]certSelfSigned: The certificate is self signed. # [ssl::]certDomainMismatch: The certificate CN domain does not # match the name the name of the host we are connecting to. # # The ssl::certHasExpired, ssl::certNotYetValid, ssl::certDomainMismatch, # ssl::certUntrusted, and ssl::certSelfSigned can also be used as # predefined ACLs, just like the 'all' ACL. # # NOTE: The ssl_error ACL is only supported with sslproxy_cert_error, # sslproxy_cert_sign, and sslproxy_cert_adapt options.

acl aclname server_cert_fingerprint [-sha1] fingerprint
  # match against server SSL certificate fingerprint [fast]
  #
  # The fingerprint is the digest of the DER encoded version 
  # of the whole certificate. The user should use the form: XX:XX:...
  # Optional argument specifies the digest algorithm to use.
  # The SHA1 digest algorithm is the default and is currently
  # the only algorithm supported (-sha1).

acl aclname at_step step
  # match against the current step during ssl_bump evaluation [fast]
  # Never matches and should not be used outside the ssl_bump context.
  #
  # At each SslBump step, Squid evaluates ssl_bump directives to find
  # the next bumping action (e.g., peek or splice). Valid SslBump step
  # values and the corresponding ssl_bump evaluation moments are:
  #   SslBump1: After getting TCP-level and HTTP CONNECT info.
  #   SslBump2: After getting SSL Client Hello info.
  #   SslBump3: After getting SSL Server Hello info.

acl aclname ssl::server_name [option] .foo.com ...
  # matches server name obtained from various sources [fast]
  #
  # The ACL computes server name(s) using such information sources as
  # CONNECT request URI, TLS client SNI, and TLS server certificate 
  # subject (CN and SubjectAltName). The computed server name(s) usually
  # change with each SslBump step, as more info becomes available:
  # * SNI is used as the server name instead of the request URI,
  # * subject name(s) from the server certificate (CN and
  #   SubjectAltName) are used as the server names instead of SNI.
  #
  # When the ACL computes multiple server names, matching any single
  # computed name is sufficient for the ACL to match.
  #
  # The "none" name can be used to match transactions where the ACL
  # could not compute the server name using any information source
  # that was both available and allowed to be used by the ACL options at
  # the ACL evaluation time.
  #
  # Unlike dstdomain, this ACL does not perform DNS lookups.
  #
  # An ACL option below may be used to restrict what information 
  # sources are used to extract the server names from:
  #
  # --client-requested
  #   The server name is SNI regardless of what the server says.
  # --server-provided
  #   The server name(s) are the certificate subject name(s), regardless
  #   of what the client has requested. If the server certificate is
  #   unavailable, then the name is "none".
  # --consensus
  #   The server name is either SNI (if SNI matches at least one of the
  #   certificate subject names) or "none" (otherwise). When the server
  #   certificate is unavailable, the consensus server name is SNI.
  #
  # Combining multiple options in one ACL is a fatal configuration
  # error.
  #
  # For all options: If no SNI is available, then the CONNECT request
  # target (a.k.a. URI) is used instead of SNI (for an intercepted
  # connection, this target is the destination IP address).

acl aclname ssl::server_name_regex [-i] \.foo\.com ...
  # regex matches server name obtained from various sources [fast]

acl aclname connections_encrypted
  # matches transactions with all HTTP messages received over TLS
  # transport connections. [fast]
  #
  # The master transaction deals with HTTP messages received from
  # various sources. All sources used by the master transaction in the
  # past are considered by the ACL. The following rules define whether
  # a given message source taints the entire master transaction,
  # resulting in ACL mismatches:
  #
  #  * The HTTP client transport connection is not TLS.
  #  * An adaptation service connection-encryption flag is off.
  #  * The peer or origin server transport connection is not TLS.
  #
  # Caching currently does not affect these rules. This cache ignorance
  # implies that only the current HTTP client transport and REQMOD
  # services status determine whether this ACL matches a from-cache
  # transaction. The source of the cached response does not have any
  # effect on future transaction that use the cached response without
  # revalidation. This may change.
  #
  # DNS, ICP, and HTCP exchanges during the master transaction do not
  # affect these rules.

ENDIF acl aclname any-of acl1 acl2 ... # match any one of the acls [fast or slow] # The first matching ACL stops further ACL evaluation. # # ACLs from multiple any-of lines with the same name are ORed. # For example, A = (a1 or a2) or (a3 or a4) can be written as # acl A any-of a1 a2 # acl A any-of a3 a4 # # This group ACL is fast if all evaluated ACLs in the group are fast # and slow otherwise.

acl aclname all-of acl1 acl2 ... 
  # match all of the acls [fast or slow]
  # The first mismatching ACL stops further ACL evaluation.
  #
  # ACLs from multiple all-of lines with the same name are ORed.
  # For example, B = (b1 and b2) or (b3 and b4) can be written as
  #   acl B all-of b1 b2
  #   acl B all-of b3 b4
  #
  # This group ACL is fast if all evaluated ACLs in the group are fast
  # and slow otherwise.

Monta tu LAMP+ en menos de dos minutos

Seguro que much@s de nosotr@s cuando hemos tenido que desarrollar alguna página Web en un entorno Windows montado alguna vez la suite de software XAMPP de Apache Friends para salir del paso y tener un entorno mínimo comenzar a programar, en vez de instalar un servicio uno por uno porque además de que en Windows es uno de los sistemas en los que este trabajo resulta algo más laborioso.

Sin embargo, Linux o los sistemas UNIX-like son mucho más amigables en cuánto entornos de desarrollo tanto de software como de aplicaciones Web. El uso de los gestores de paquetes junto con el amplio soporte de software oficial incluido en los repositorios, el uso de librerías compartidas del sistema, la documentación extensa y sobre todo las mil y una funcionalidades en materia de seguridad, optimización, escalabilidad... que se pueden añadir para potenciar el sistema operativo, hacen que los UNIX-like sean clave para este tipo de tareas.

Como ejemplo disparatado, la lista de servidores top500, en los que el 100% de los supercomputadores más potentes del mundo hacen uso de Linux para todo tipo de operaciones y cálculos. Para que veamos, que aquell@s que tengamos un "tuxito" instalado en nuestro PC, no tenemos un SO de "juguete".

¿Qué es Lampy?

Lampy es un script que permite instalar en poco menos de 1 paso un entorno de desarrollo Web. Un servidor Web que puede ser Apache o Nginx; un servidor FTP (vsftpd); un sistema gestor de base de datos que en este caso es MariaDB y por último el lenguaje de desarrollo web PHP.

Actualmente, solo se puede utilizar para Archlinux, Debian, Fedora, openSUSE y Ubuntu, pero que en un futuro iremos añadiendo más características y soporte para otras distribuciones como Gentoo y CentOS.

El script se puede obtener desde el repositorio de Gitlab

git clone https://gitlab.com/sincorchetes/lampy.git

¡Un saludo y a disfrutarlo!

No podemos montar My Passport WD en Linux

Nos dejaron un disco duro My Passport WD para pasarle unos archivos con la grata sorpresa de toparnos con un fallo de montaje porque no reconoce el dispositivo, y cómo lo hemos solucionado, vamos a publicar cómo arreglarlo para salir del paso.

¿Por qué no nos reconoce el sistema de archivos?

Parece que los Western Digital My Passport, vienen con un formato llamado exFAT, que es un formato desarrollado por Microsoft que mejora el rendimiento de unidades flash (estándar para memorias SDXC)o cuando NTFS no es factible por la sobrecarga de entradas de registro de archivos. También nace como alternativa al viejo FAT(32). Al parecer hay distribuciones como Fedora que no incorporan por defecto el driver para poder leer este tipo de sistema de ficheros.

¿Cómo podemos solucionarlo?

Tan solo bastaría con instalar el paquete exfat-tools y fuse-exfat para poderlo montar.

Fedora

En Fedora solo tenemos que ejecutar:

$ su -c "dnf install fuse-exfat exfat-tools"

Y listo, enchufamos el dispositivo y tendremos acceso a los datos.

Debian, Ubuntu...

Para Ubuntu, Debian y derivadas, bastará con instalar:

$ sudo apt-get install exfat-fuse exfat-utils

CentOS, RHEL

En CentOS y RHEL es un poco más compleja su instalación ya que no se encuentran los paquetes de forma oficial y hay que, o bien compilar el código fuente, o bien hacer uso de un repositorio yum(8) a terceros. Nosotros os dejaremos la instalación con el repo de YUM, pero también al final, mencionaremos la compilación del código fuente.

CentOS

La diferencia entre CentOS y RHEL, es que RHEL al ser corporativo no añade todos los paquetes comunitarios como tiene CentOS, además de obtener más rápidamente actualizaciones de seguridad siempre que dispongamos de licencia.

# yum -y install epel-release && rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
# rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro

Añadimos includepkgs=exfat-utils fuse-exfat en el archivo /etc/yum.repos.d/nux-desktop.repo justo debajo de protect=0 en el apartado [nux-desktop] tal que así:

[nux-dextop]
name=Nux.Ro RPMs for general desktop use
baseurl=http://li.nux.ro/download/nux/dextop/el7/$basearch/ http://mirror.li.nux.ro/li.nux.ro/nux/dextop/el7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-nux.ro
protect=0
includepkgs=exfat-utils fuse-exfat

Instalamos los paquetes mediante yum(8):

$ su -c "yum install exfat-utils fuse-utils"

Bastará con que conectemos el disco duro para que monte.

RHEL

La diferencia con los pasos anteriores, es que el paquete epel-relese que contiene la información del repositorio EPEL de Fedora no está incluido en sus repositorios, por lo tanto hay que instalarlo:

# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

El resto de pasos es el mismo.

Archlinux

En Archlinux, al parecer compilaron el git y generaron solo un paquete.

$ sudo pacman -S exfat-utils

openSUSE Leap y Tumbleweed

Parecido a Fedora

$ sudo zypper in exfat-utils fuse-exfat

Gentoo

# emerge -av exfat-utils fuse-exfat

Código fuente

  1. Obtenemos el código fuente desde aquí
  2. Extramos el código
  3. Configuramos e instalamos (Se nos pedirá autoreconf como dependencia para compilar, que se encuentra en tarball autoconf, automake y el paquete de desarrollo de FUSE)
$ autoreconf --install
$ ./configure --prefix=/usr
$ make install clean

NOTA: Si compilamos en otro directorio que no se encuentre añadido a la variable PATH de /etc/profile.d/ o .bash_profile. Tendremos que añadirlo.

  1. Vemos la versión
$ mount.exfat-fuse
FUSE exfat 1.2.8
Usage: ./mount.exfat-fuse [-d] [-o options] [-V] <device> <dir>

Montando desde CLI

Si queremos utilizar la terminal bastará con ejecutar:

$ sudo mount.exfat-fuse /dev/sdX /directorio_a_montar

Referencias

No-IP - ¿Cómo obtener un acceso fijo a un servidor?

Seguramente alguna que otra vez nos ha interesado montar un servidor casero ya sea para alojar contenido Web, enviar e-mails... o tener un gestor de descargas al que conectarnos a nuestra casa, dejar descargando cosa X y que al llegar esté listo para alojarlo en una unidad USB para un uso Y.

Sin embargo, si nos damos cuenta, cada vez que reiniciamos el router, obtener otra IP diferente y se nos va todo al garete. Tenemos que volver a obtener la dirección de nuestra IP pública a través de un servicio como What's my IP?,ipify... esto es debido a que el ISP (Proveedores de Servicio de Internet) como Movistar otorga nuevas direcciones IP cuando detectan que se conecta un dispositivo a su pool de direcciones, machacando la vieja IP y obteniendo una nueva. Sin embargo, hay ISP como ONO (ahora Vodafone) que otorgan una IP fija y evita hacer uso de este post.

NOTA: Se puede solicitar una IP estática pública, pero los precios para ello son muy elevados y muchas veces no compensa dependiendo de la actividad que vayamos a realizar.

¿Cómo acabar con el problema?

Existen muchos servicios en Internet que pueden darnos una IP fija como Dyn (antes DynDNS), no obstante, vamos a utilizar los servicios de No-IP.org. Este servicio te proporciona un subdominio a elección, y un dominio ya existente, con lo que, realmente accederás al dominio y no a una IP X con lo que será mucho más fácil acordarnos.

Una vez que nos registremos y tengamos instalado el servicio, este preguntará cada cierto tiempo la IP pública, y si es nueva la irá renovando junto con los servidores de No-IP para qué cada vez que queramos acceder esté operativo aunque haya cambiado más de 100 veces de IP.

Registro

Primero accedemos a la página mediante el siguiente enlace, y nos registramos escogiendo un subdominio y un dominio ya existente.

[owl-carousel items=1 margin=10 loop=true autoplay=true autoplayHoverPause=true nav=true] [/owl-carousel]

Nos enviarán un correo de confirmación, por lo que sería conveniente que revisemos las bandejas de Spam o "correo no deseado" en caso de que no nos aparezca en la bandeja de entrada normalmente suele tardar milésimas de segundos.

Instalando el servicio

Nos descargamos el servicio de No-IP desde aquí para el sistema operativo que tengamos, vale FreeBSD, Linux, Windows, OS X...

Linux

En este apartado veremos como se instala, configura y ejecuta el servicio:

Fedora

Para instalarlo en Fedora, solo hay que ejecutar:

$ su -c "dnf install noip"

Y se instalará, este servicio se encuentra en los repositorios oficiales por lo que no necesitaremos añadir ningún repositorio adicional y cuenta con el respaldo de la comunidad directamente.

Código fuente

Parece que Fedora es la única distribución dentro de las más populares que mantiene noip de forma comunitaria y oficial. En este apartado explicaremos como instalarlo mediante código fuente para el resto de distribuciones.

$ wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz
$ tar xfv noip-duc-linux.tar.gz
$ cd noip-2.1.9-1

Por defecto, si lo compilamos y lo instalamos se instalará en el directorio /usr/local, para configurar un directorio diferente, hay que redefinir el PREFIX= que se incluye dentro del fichero Makefile. Por ejemplo:

TGT=noip2
CC=gcc
PKG=noip-2.1.tgz

PREFIX=/opt/noip
CONFDIR=${PREFIX}/etc
BINDIR=${PREFIX}/bin

# these defines are for Linux
LIBS=
ARCH=linux

[Texto cortado]

Se instalará en el directorio /opt/noip, recordemos que si configuramos un directorio ajeno a /usr; /usr/local hay que añadir a la variable PATH de nuestro .bash_profile o /etc/profile.d/noip.sh

/etc/profile.d/noip.sh

#!/bin/bash
PATH=$PATH:/opt/noip/bin
export PATH

Ejecutamos:

$ sudo make install

Se instará en el directorio /opt/noip siguiendo el ejemplo de arriba, y nos saltará una salida interactiva como esta:

if [ ! -d /opt/noip/bin ]; then mkdir -p /opt/noip/bin;fi
if [ ! -d /opt/noip/etc ]; then mkdir -p /opt/noip/etc;fi
cp noip2 /opt/noip/bin/noip2
/opt/noip/bin/noip2 -C -c /tmp/no-ip2.conf

Auto configuration for Linux client of no-ip.com.

Multiple network devices have been detected.

Please select the Internet interface from this list.

By typing the number associated with it.
0   wlo1
1   vboxnet0

Nos está pidiendo qué interfaz es la que se encuentra conectada a Interner y cuál utilizaremos (en caso de tener más de una NIC), seleccionamos wlo1 (en mi caso.).

Please enter the login/email string for no-ip.com  [INSERTA AQUÍ EL E-MAIL CON EL QUE TE REGISTRASTE]
Please enter the password for user [TU_EMAIL] [INSERTA LA CONTRASEÑA]

Only one host [echemosunbitstazo.sytes.net] is registered to this account.
It will be used.
Please enter an update interval:[30]  [EN MINUTOS]
Do you wish to run something at successful update?[N] (y/N)  [PODEMOS DECIR QUE SÍ PARA QUE EJECUTE UN SCRIPT CADA VEZ QUE LA OPERACIÓN SALGA BIEN]
Please enter the script/program name  [SI HAS ESCOGIDO QUE SI EN LA PREGUNTA ANTERIOR, INTRODUCE LA RUTA, SI NO IGNORA EL MENSAJE]
New configuration file '/tmp/no-ip2.conf' created.

mv /tmp/no-ip2.conf /opt/noip/etc/no-ip2.conf

Perfecto, ya lo tenemos configurado.

Trabajando con No-IP en Linux

Para ejecutar el servicio siguiendo el ejemplo anterior basta con:

/opt/noip/bin/noip2

Y ya estrá trabajando:

$ ps aux |grep noip2
nobody   10219  0.0  0.0  23220  2008 ?        Ss   16:32   0:00 /opt/noip/bin/noip2

Mostrando la configuración actual:

/opt/noip/bin/noip2 -S

Obtendremos una salida como esta:

1 noip2 process active.

Process 10219, started as noip2, (version 2.1.9)
Using configuration from /opt/noip/etc/no-ip2.conf
Last IP Address set [TU_IP_PÚBLICA]
Account [TU@EMAIL.COM]
configured for:
    host  echemosunbitstazo.sytes.net [TU_DIRECCIÓN_REGISTRADA]
Executing /opt/noip/success.sh upon successful update. [SCRIPT_QUE_CONFIGURASTE_SI_NO_LO_HICISTE_OBVIALO]
Updating every 30 minutes via /dev/wlo1 with NAT enabled. [NOTIFICA QUE HAY NAT EN TU CONEXIÓN, Y USA LA NIC QUE CONFIGURASTE]

Prueba rápida de conexión si no tenemos el bloqueo de respuestas ICMP en nuestro firewall habilitado:

PING echemosunbitstazo.sytes.net (TU_IP_PUBLICA) 56(84) bytes of data.
64 bytes from A.red-B.dynamicip.rima-tde.net (TU_IP_PUBLICA): icmp_seq=1 ttl=64 time=4.73 ms
64 bytes from A.red-B.dynamicip.rima-tde.net (TU_IP_PUBLICA): icmp_seq=2 ttl=64 time=5.04 ms
64 bytes from A.red-B.dynamicip.rima-tde.net (TU_IP_PUBLICA): icmp_seq=3 ttl=64 time=4.89 ms
--- echemosunbitstazo.sytes.net ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 4.733/5.069/5.609/0.333 ms

Si tenemos un servidor SSH, nos conectamos:

ssh USUARIO@TU_URL_REGISTRADA.XXX

NOTA: Puede que este proceso lleve pasos adicionales en el router, como redireccionamiento de puertos o la apertura de los mismos. Como recomendación, si tenemos un router con acceso SSH y web, lo mejor es modificar el puerto de los servicios o bien hacer un redireccionamiento de los puertos en el router.

Creando entrada en el gestor de servicios

En este apartado, te explicaremos cómo añadir No-IP al gestor de servicios systemd(1)

Creamos un archivo en /etc/systemd/system/noip2.service y añadimos las siguientes líneas siguiendo el ejemplo anterior. Si lo hemos instalado con el PREFIX por defecto lo adaptamos.

[Unit]
Description=No-IP2 service
Requires=network.target

[Service]
ExecStart=/opt/noip/bin/noip2 -c /opt/noip/etc/no-ip2.conf

[Install]
WantedBy=network.target

Para ejecutarlo:

$ sudo systemctl start noip2.service

Para pararlo:

$ sudo systemctl stop noip2.service

Para habilitarlo cuando inicie el sistema

$ sudo systemctl enable noip2.service

Para deshabilitarlo cuando arranque el sistema:

$ sudo systemctl disable noip2.service

Windows

En Windows deberás descargarte el cliente desde el siguiente enlace y proceder a su instalación.

Una vez instalado, se nos abrirá el cliente pidiéndonos el login, una vez pasada esta ventana, simplemente añadimos la máquina y ya tenemos el servicio corriendo.

[owl-carousel items=1 margin=10 loop=true autoplay=true autoplayHoverPause=true nav=true] [/owl-carousel]

Recursos

No-IP.org ~ Página documentada noip.tar.gz ~ LEEME, instrucciones de instalación

Parcellite, un portapapeles liviano

Esto es una gran frase, quién recupera información que la da por perdida y es valiosa para sí, obtiene una remuneración, sea económica, o en términos de tiempo. Y claro que sí, a quién no le ha pasado que ha copiado un código largo creyendo que tenía el portapapeles instalado, y de repente ¡zas!, lo perdiste después de haberte llevado horas intentando desarrollarlo.

Pues bien, Parcellite es una de las soluciones para estas urgencias y necesidades. Además de poder almacenar cuántos registros se le configure, es uno de los portapapeles que menos consumen para entornos gráficos tanto para Linux como otros sistemas BSD. Lo podemos obtener desde los repositorios en un periquete ya que está ampliamente soportado por la mayor parte de distribuciones y también por los sistemas BSD.

Características

Este genial software fue creado por un tal Gilberto Miralla y Doug Springer, está elaborado en GTK+, traducido por casi una veintena de personas registradas, se encuentra licenciado bajo GPL y sobre todo funciona perfectamente en cualquier entorno de escritorio o gestores de ventanas como i3, Fluxbox...etc teclado o con el ratón
Parcellite suele utilizar poca memoria RAM (~14MB) como mucho y tiene unas funcionalidades que vienen ideales como: * Aparece un icono en la bandeja del sistema * Permite almacenar un máximo de 50 registros y limitar el tamaño de MB del mismo * Se puede configurar para que se omita la copia desde el ratón o desde la combinación de teclas * Editar las entradas del historial * Modificar el comportamiento de la vista de la lista de entradas * Limitar el tamaño de los registros * Opción multiusuario para que todos puedan utilizarlo simultáneamente * Pueden crearse acciones para lanzar programas y aplicaciones pulsando Ctrl+Clic en el icono de Parcellite que se genera en la bandeja de entrada. * Puede configurarse los atajos del teclado para interactuar con él * Permite exportar el historial en formato texto plano

¿A qué esperas? ¡Pruébalo ya!

Index

Gentoo Linux es una metadistribución que se caracteriza por ser altamente configurable y personalizable entre todas las existentes en el mundo de Linux. El usuario que utilice Gentoo Linux, no sólo puede compilar el software a su medida, escogiendo las características que quiere que tome; si no también, puede compilar ese software para su propio soporte de CPU acelerando aún más la fluidez y el consumo del mismo.

Gentoo Linux promete desde su instalación, un comienzo personalizable al gusto del usuario. Ya que este proceso se realiza a través de comandos y no existe interfaz gráfica de instalación que lo oriente. Para la instalación se emplea un archivo comprimido llamado stage que difunde el proyecto Gentoo en un tiempo que ellos consideran, posteriormente hay que seguir una serie de procesos documentados en su Wiki para poder ir realizando la instalación.

| Este proceso no es apto para personas sin paciencia y que no leen.

Algunos conceptos básicos

Antes de entrar en detalles, me gustaría dejar claro una serie de términos, para aquell@s que no lo sepan para no pasarlos por alto: * Lenguaje de programación: Permite interactuar con el equipo en un lenguaje que nosotros podemos entender como si fuera hablar en inglés u otro idioma extranjero. Los más típicos son C, C++... * Código fuente: Es el ADN del programa y/o software, contiene todo para que funcione. Sin él, no hay programa directamente. Y se escribe en un lenguaje de programación. * Compilador: Programa que traduce el lenguaje de programación en lenguaje de máquina, que serían los famosos 0 y 1. * Binario: Es el archivo que genera el compilador tras haber traducido el código fuente. * Tarball: Comprimido que almacena código fuente. * Proceso de compilación. Es aquel que permite traducir el lenguaje de programación leíble por ti y por mí, a un lenguaje de máquina como es el lenguaje binario. Imagínate que quieres publicar un libro, el cuál va a ser leído por multitud de personas. Entonces, te apresuras a empezar, redactando un borrador del libro. El cuál lo harás en un determinado lenguaje como puede ser el español o el inglés. Todos los días vas añadiendo líneas y/o borrando cosas que no encajen y añadiendo comentarios sobre el por qué lo hiciste. Finalmente, terminas el borrador y lo llevas a la imprenta. Allí sale el libro terminado, listo para ponerlo a venta al público.

| Código fuente (borrador) > Compilador (Imprenta) > Binario (Libro).

Un poco de historia

Antes de liberarse Gentoo Linux en marzo de 2002. El fundador, Daniel Robbins mantenía una distribución llamada Enoch Linux cuyo objetivo consistía en no facilitar paquetes binarios pre-compilados como hacen la mayoría de distribuciones actuales, consiguiendo así agilizar y afinar el software en términos de rendimiento.

Daniel Robbins, probó un fork (bifurcación) de GCC conocido como EGCS desarrollado por Cygnus Solutions y renombró el nombre de Enoch Linux a Gentoo Linux. Sin embargo, más tarde decidió detener el desarrollo de Gentoo Linux y se fue a explorar el mundo de FreeBSD (un SO basado en BSD y constantemente evolucionando) para obtener más conocimientos sobre el sistema de ports, así, posteriormente, trasladarlo a Gentoo Linux y tener una bella obra de arte como es actualmente Portage. Finalmente, Gentoo Linux vio de nuevo la luz en marzo del 2002 con su versión 1.0.

Beastie, la mascota de BSD.

¿Qué es Portage?

Portage es un gestor de alto nivel que permite interactuar con este bello sistema. Uno de los comandos que se utilizan para gestionar el software instalado en el sistema se llama emerge. Está escrito en Python mayormente y se encuentra en /usr/lib/python-exec/version_python/emerge

En el siguiente vídeo de ejemplo podemos ver como interactuar con él:

¿Cómo funciona?

Este comando se apoya de un fichero general ubicado en /etc/portage/make.conf, en el que se establecen algunas características generales almacenadas en variables de Bash como puede ser CFLAGS, MAKEOPTS, USE... que explicaremos a continuación:

| Los procesadores contienen una serie de FLAGS (instrucciones) que permiten acelerar o mejorar el proceso de compilación del software. Por lo general, el software en otras distribuciones de Linux se compilan con los menos flags posibles para no alterar el uso del mismo en cualquier ordenador o dispositivo que utilicen otros CPUs.

  • CFLAGS: Es un array en el que se definen las FLAGS que utilizará tu procesador (o las que quieras utilizar) en el software que utilizarás después una vez que el compilador GCC construya un paquete. Digamos, que si compras un traje en una tienda. Por lo general, están elaborados para que todos podamos utilizar dicho traje. Pero siempre quedarán costuras más ceñidas que otras, haciendo que el traje sea igual de válido para todos, pero no ajustado a nuestra silueta. Sin embargo, si mandamos ha hacer un traje a nuestra medida, o a la medida que le digamos que queremos el traje, ya lo estamos haciendo único y exclusivo para nosotros, o para el acompañante. Esa es en parte la finalidad de las CFLAGS. Aprovechar todo el potencial de nuestro CPU para compilar los paquetes. La contrapartida es que si se le "dejamos" el traje a un amigo, este puede que no le valga.

  • MAKEOPTS: Permite definir la cantidad de números de CPUs físicos y virtuales que quieres utilizar para compilar de forma paralela. Este proceso aprovecha todos los núcleos/threads de nuestro procesador incluyendo los subprocesos para llevar a cabo la compilación del paquete. Imagínate, que para hacer un traje solo tenemos una empresa con 20 costurer@s, pero mandamos a trabajar a 1 sola persona. El traje acaba terminado a los 3 días. Pero, ¿y si ponemos a esos 20 costurer@s a trabajar para hacerlo? En menos de un día lo tenemos hecho. Esto es lo mismo al usar esta variable. Su uso implica siempre sumar +1 al número actual de núcleos de procesamiento y subprocesos. Por ejemplo, si tenemos un i5 con 2 núcleos y 2 subprocesos. El valor debería ser MAKEOPTS="-j5" y no "-j4".

  • USE: Un array en el que defines las características con la que queremos que se compilen los paquetes del sistema. Si queremos que se utilice KDE, GNOME, Qt4, Qt5... se habilitan haciendo uso del signo + y si no -. Extrapolándolo al ejemplo del traje, aquí logramos personalizarlo añadiendo el color que queramos, la tela...

| Nota personal: Prefiero dejar pocos valores en USE en el archivo /etc/portage/make.conf y utilizar un fichero separado como /etc/portage/packages.use/nombre_fichero para cada paquete que quieras instalar y especificar las USE de cada paquete allí para evitar problemas posteriormente, porque cuando la defines en el fichero general, lo aplicará a todo el software que quieras compilar y puede que te generen conflictos.

  • FEATURES, este array permite añadir algunas características a Portage como:
    • parallel-fetch: Utilizar descarga paralela, imagínate que la empresa de confección de trajes o ropa, le compra la tela, botones... a una distribuidora la cuál solo usa un furgón de reparto para todo. Puede que pinche los neumáticos y no llegue a tiempo. No obstante, puede mandar todo repartido en varios furgones, esto permite mayor carga y además más rapidez, si pincha uno las gomas, no pasa nada.
    • user-fetch: La descarga se hace mediante usuario sin privilegios. Más info aquí
  • GENTOO_MIRROR: Array en el que añades mirrors para evitar que sí cae uno por el motivo que sea, salte al otro sin problema. Imagínate que tienes 1 distribuidora de material textil para confeccionar la ropa, y casualmente un día te falla por el motivo que sea. ¿Qué haces? ¿Dejas tirado a tus clientes porque esa empresa te ha fallado? ¿No, verdad? Se concierta otras para evitar que sucedan este tipo de cosas y no dejes a tus clientes plantados.
  • L10N (como reemplazo a LINGUAS), especifica el idioma y/o los idiomas que quieras mantener instalado en tu sistema. Puedes tener más de 1 sin ningún problema.
  • PORTDIR: Variable cuyo valor es el directorio dónde se encuentra el árbol de paquetes, generalmente se suele dejar por defecto.
  • PKGDIR: Variable que contiene el directorio con los tarballs que contienen el código fuente. Suele dejarse por defecto.
  • CPU_FLAGS_X86: Array que pretende sustituir los registros de estado comúnmente denominado en inglés FLAGS del procesor que suelen añadirse también como registros USE, y así los mantienen más ordenados.
  • VIDEO_CARDS: Array en el que defines que drivers vas a utilizar según la tarjeta gráfica que tengas, siempre y cuando utilices servidor gráfico.
  • INPUT_DEVICES: Otro array en el que añades los controladores que utilizas para los periféricos en el caso de utilizar servidor gráfico.
  • CHOST: Variable que se suele dejar por defecto. Si quieres otra versión de GCC, en ese caso, se debería seguir cuidadosamente las siguientes instrucciones 1 y 2.

Hay más variables y arrays que se pueden utilizar para definir más características como por ejemplo APACHE2_MODULES que asigna los módulos que se quieren utilizar para Apache; PORTDIR_OVERLAY para definir en qué directorio alojar los overlays...et

Licencias y acuerdos de licencia de software adicional

Hay software en Gentoo Linux que aunque en su mayor parte es software libre y/u Open Source, encontrarás software privativo como es el caso de los drivers de NVIDIA, TeamViewer, VirtualBox... con lo que conlleva a que aceptemos una serie de licencias como la PUEL, NVIDIA...etc para ello, hay un fichero ubicado en /etc/portage/package.license.

Aceptando licencias

En él, podrás añadir el paquete que quieras instalar más el nombre de la licencia que pide y se pueden añadir de 2 formas: * >=dev-util/nvidia-cuda-toolkit-6.5.14 NVIDIA-CUDA * dev-util/nvidia-cuda-toolkit NVIDIA-CUDA

¿Cuál es la diferencia? No tan sustancial. Puedes indicar que las versiones que sean superiores a la 6.5.14 pidan de nuevo volver modificar package.license. Mientras que la segunda, sea cual sea la versión aceptará las condiciones.

Instalar paquetes bloqueados

En cuánto a los paquetes bloqueados, son paquetes no testados y considerados de índole "inestable". Es decir, no han sido aprobados como estables dentro del árbol de Portage. Hay que añadir el paquete a instalar más la arquitectura que estás utilizando en cuestión en el fichero /usr/portage/package.accept_keywords

Como mencioné anteriormente, se puede utilizar la misma sintaxis para este tipo de software como para el de las licencias: * >=dev-db/sqlmap-1.0.6 ~amd64 * dev-db/sqlmap ~amd64

Bloquear paquetes de forma voluntaria

Puede que carezca de sentido, pero si a lo mejor emerge se pone un pelín caprichoso y no te deja compilar un paquete porque te avisa de que lo bloquees por algún motivo. Se puede hacer. En este caso hay que añadir solo el nombre del paquete en el fichero: /etc/portage/packages.mask/nombre_fichero * >=dev-db/sqlmap-1.0.6 * dev-db/sqlmap Puedes obtener más información sobre Portage a través de su documentación.

Algunas diferencias entre Portage y el FreeBSD Ports Collection

Portage, es un gestor de paquetes de alto nivel que está inspirado en el árbol de ports de FreeBSD. Los ports en FreeBSD son un conjunto de directorios con scripts elaborados en lenguaje script que permiten y facilitan la instalación de software desde tarballs (códifo fuente).

FreeBSD no tiene un gestor de paquetes de alto nivel que simplifique la tarea como tiene Gentoo Linux con emerge. En este SO, tienes que ir directorio tras directorio efectuando un make install clean. Eso sí, si el software que pretendes instalar tiene dependencias, las compila también, esto suprime la necesidad de ir directorio tras directorio.

Si coges un listín telefónico ordenado por categorías, dentro de esas categorías hay subcategorías y finalmente los negocios, locales, y personas con su nombre, descripción, y teléfono de contacto. Al que si llamas te ofrece un servicio.

Este es un ejemplo del árbol de Portage:


├── app-accessibility
│   ├── accerciser
│   │   ├── accerciser-3.14.0.ebuild
│   │   ├── ChangeLog
│   │   ├── ChangeLog-2015
│   │   ├── Manifest
│   │   └── metadata.xml
│   ├── at-spi2-atk
│   │   ├── at-spi2-atk-2.16.0-r1.ebuild
│   │   ├── at-spi2-atk-2.18.1.ebuild
│   │   ├── at-spi2-atk-2.20.1.ebuild
│   │   ├── ChangeLog
│   │   ├── ChangeLog-2015
│   │   ├── files
│   │   │   ├── at-spi2-atk-2.16.0-atk_suite.h
│   │   │   ├── at-spi2-atk-2.16.0-null-gobject.patch
│   │   │   ├── at-spi2-atk-2.16.0-out-of-source.patch
│   │   │   └── at-spi2-atk-2.16.0-tests-data
│   │   │       ├── test-accessible.xml
│   │   │       ├── test-action.xml
│   │   │       ├── test-component.xml
│   │   │       └── test.xml

¿Qué contiene un paquete en Gentoo?

En Gentoo a diferencia de otras distribuciones de Linux, un paquete no es un archivo comprimido que sigue una serie de pautas de empaquetamiento y que en él se incluya software ya pre-compilado. Se le llama así exactamente a lo que es en FreeBSD un port (un conjunto de carpetas y archivos varios legibles que permiten la instalación de un software a partir del código fuente compilándolo).

Aquí puedes ver que un paquete está constituido por varios archivos. Especialmente los que más se repiten como patrón son:

Metadata.xml: XML que se utiliza para saber quién es el matenedor de ese paquete entre otras cosas. Manifest: Archivo que contiene la suma de comprobación para verificar si el paquete que se ha descargado de los repositorios coincide con la suma que contiene el fichero en un hash determinado como puede ser SHA1, SHA256... *.ebuild: Fichero que contiene todo lo necesario para instalar un software determinado. En él se incluye información como: * Nombre * Descripción * Licencia * Palabras clave (arquitecturas) * Dependencias * Si incluye o no parches * Si necesita configuración adicional para soporte multilib * ChangeLog: Permite visualizar los cambios que ha sufrido este paquete a lo largo del tiempo.

¿Y un port en FreeBSD?

Por otro lado, FreeBSD tiene la siguiente estructura, similar como no:

  • Makefile: Fichero que incluye información como:
  • Nombre del port
  • Versión
  • Revisión
  • Categoría
  • Web oficial
  • Mantenedor
  • Comentario
  • Dependencias...
  • distinfo: Contiene un tipo de hash para comprobar si cumple con la suma de verificación y el nombre del archivo a descargar junto con su versión, revisión y extensión.
  • pkg-descr: Descripción larga del port
  • pkg-plist: Lista de archivos que se van a instalar relativo al port en cuestión (no el resto de dependencias si las tuviera)

Ejemplo de uso:

Ya, para de hablar de Portage ¿Qué hay de los servicios?

Gentoo por norma general recomienda utilizar OpenRC, que es un gestor de daemons (nombre antiguo para definirse a servicios) muy bueno y se encuentra disponible tanto para Gentoo Linux como para sistemas BSD como FreeBSD. Manjaro y/o Archlinux lo mantienen en sus repositorios. OpenRC se caracteriza por respetar la filosofía KISS (Keep It Simple, Stupid!) en español ¡Hazlo sencillo!, ¡Estúpido!

Algunas características de OpenRC

OpenRC se caracteriza entre otras cosas: * BusyBox; como entorno single mode reemplazo de init * Añade ficheros init.d específicos para un entorno BusyBox * Reemplazar udev con mdev y/o eudev * Compatible con Wicd, Network Manager, Pulseaudio... * runlevels específicos durante el arranque * Uso de CGroups (una forma de gestionar procesos por grupos) * Soporte chroot

¿Cómo trabajar con OpenRC?

Los comandos que suelen utilizarse para interactuar con él son: * rc-status: Muestra información sobre los daemons de todos los runlevels o uno específico * rc-config: Configura un runlevel añade o elimina un daemon que esté en él; ó bien para, inicia un daemon... * rc-service: Arranca o paraliza daemons

El fichero de configuración de OpenRC se llama rc.conf y está ubicado en el directorio /etc

¿Otras forma de tener Gentoo?

Gentoo no sólo se puede utilizar conjuntamente con Linux. Puedes encontrarlo con sistemas BSD como FreeBSD, OpenBSD, NetBSD, combinado el potencial de Gentoo con el resto de sistemas operativos. No me podría imaginar un OpenBSD y su firewall y seguridad con las herramientas que tiene Gentoo. Y no solo eso, existen multitud de proyectos como Gentoo Hardened que pretende hacer de Gentoo Linux algo tan blindado como OpenBSD.

Referencias

Recuperando el acceso al usuario root

¿Qué pasa cuando nos olvidamos de la contraseña de root?

— Cariño, ¿A dónde vas?

— Pues a comprar

— ¿No me das un beso?

— Pero..., si vuelvo en un momento

— Vale, vale...

Creo que tod@s l@s que hemos tenido pareja, entendemos esa escena en la que escuchamos ese Vale vale con cierto rintintín como si estuvieran diciendo "Oye te quedas sin postre esta noche"... Pues esto es igual, pero depende de la gravedad del asunto nos puede resultar un suplicio o podemos pasar un buen rato aprendiendo. Como nos olvidemos de la contraseña del superusuario y no tengamos sudo(1) configurado con las restricciones y permisiones respectivas para poder llevar a cabo tareas de administración la tenemos crudo. Sin embargo, tenemos un método alternativo para asignar una nueva contraseña y salir del apuro.

¡Comencemos!

Requisitos

En primer lugar, necesitamos tener bajo nuestro brazo un live CD/DVD/USB/PXE con el que arrancar un entorno Linux en nuestro ordenador, preferiblemente si tenemos un sistema que corre bajo systemd(1), utilicemos una versión similar, al igual que si usa runit(1) o upstart(1) y sobre todo que sea acorde con vuestra arquitectura instalada, si es ARM, x86 (32 bits), o x86_64/AMD64T (64-bits).

Primeros pasos

Una vez que hemos arrancado el live *, tendremos que saber, qué particiones debemos de montar y sobre todo, cada uno sabrá que esquema de particiones, en nuestro caso vamos ha hacerlo utilizando el siguiente esquema de particionado del disco.

  • /-> Raíz del sistema -> /dev/sda1
  • /boot -> Partición con el contenido de arranque -> /dev/sda2
  • swap -> Partición de intercambio -> /dev/sda3

Solo haremos uso de la partición raíz en este caso

Abriremos una terminal y escribiremos lo siguiente:

su -
mkdir /recuperacion
mount /dev/sda1 /recuperacion
mount --rbind /dev /recuperacion/dev
mount --make-rslave /recuperacion/dev
mount --rbind /sys /recuperacion/sys
mount --make-rslave /recuperacion/sys
mount -t proc /proc /recuperacion/proc

En este bloque de comandos, lo que hacemos es obtener todos los privilegios de superusuario dentro de la imagen Live.

NOTA: En otro post explicaremos que son los usuarios, grupos y qué es ser superusuario.

  1. Creamos un directorio dónde montaremos la partición raíz y la montamos
  2. Montamos los sistemas de archivos virtuales en sus respectivos directorios (dev, proc y sys)

Haciendo chrooting

Un chroot(1) es un comando que nos permite de alguna forma aislar un entorno Linux que hayamos montado en nuestro sistema y seguir trabajando sin problemas en nuestro sistema operativo, es decir, tendremos un Linux dentro de otro Linux y podremos operar con él para según que cosas. Esto es muy útil para gestiones de este tipo, en Gentoo por ejemplo se utiliza para instalar el sistema y en sistemas como FreeBSD tenemos una variante similar llamada jails(1) que es un chroot(1) con esteroides, en la que permiten lanzar servicios o "daemons" de forma aislada y sin tener que instalar un sistema base para poder operar con él.

Bien, pues vamos a por ello:

chroot /recuperacion /bin/bash

NOTA: Depende de la distribución que uses, te interesará recuperar el usuario root o el usuario corriente con sudo(1) configurado. Por ejemplo, las distribuciones como Ubuntu conceden privilegios de administración máximos del sistema a los usuarios corrientes haciendo uso de sudo(1), y las distribuciones como CentOS, Fedora, Gentoo... sin embargo, prefieren separarlo y hacer uso del comando UNIX por excelencia su(1) para autenticarse como root y tener privilegios.

Recuperando la contraseña

En caso de distribuciones con Ubuntu o en las que tengamos nuestr@ usuari@ con sudo(1):

passwd usuario_comun

En caso de distribuciones como Fedora, Gentoo, Archlinux... o que utilicen el usuario root:

passwd root

Cuando nos pida la contraseña y comencemos a escribir, por motivos de seguridad no se mostrará en la terminal, por lo que tenemos que estar seguro de lo que escribimos.

Terminando

Una vez que acabemos, desmontamos todos los sistemas de archivos y reiniciamos.

exit
umount -l /recuperacion
systemctl reboot

Referencias * Gentoo Installation Guide * FreeBSD Handbook ~ Jails * Fedora Reset Password * Google * Man pages ~ chroot(1)

Gestión y administración de usuari@s y grupos en Linux

Algunos conceptos

Linux al igual que otro sistema operativo basado en UNIX, por herencia obtiene uno de los hitos que marcó un antes y después en la era de los sistemas, y es el término multiusuario. Esto quiere decir que nos permite tener diferentes cuentas de distintos usuari@s iniciadas en el sistema corriendo n procesos a la vez pertenecientes a cada usuario. Anteriormente, si querías hacer uso del sistema y otra persona quería utilizarlo, no podías ya que tod@s disponían de una sola sesión de usuario, sin embargo con los avances que hicieron en el pasado, sacaron adelante esta magnífica característica, la del multiusuario.

Usuari@s

L@s usuari@s son personas que tienen un determinado nivel de acceso tanto a la empresa dónde resida el equipo al que pueden acceder y operar, como en su equipo personal. A nivel lógico, esto se conoce como cuentas de usuari@, las cuáles contienen como mínimo un nombre para la cuenta siendo este el nombre de usuari@ y una contraseña. No obstante, l@s desarrolladores de sistemas operativos o de cualquier otro tipo de software intentan simplificar el tratamiento de las cuentas de usuarios mediante un ID numérico, ya que se consume menos recursos buscando números que letras.

En Linux, esos ID asignados a los usuarios se les denominan UID User Identifier o identificador de usuario. Según la distribución, el primer usuario o la primera usuaria del sistema, este establece un UID de 1000, y comienza a sumarse +1 a los posteriores UID creados. También, se añade un grupo nuevo al sistema con el mismo nombre de la cuenta del usuario o de la usuaria y se establece como un grupo primario con el mismo ID.

¿Cómo crear un(a) usuari@?

Como norma general y es altamente recomendado hacer uso de los comandos useradd(8) o adduser(8) podríamos crear un(a) usuari@ a mano, haciendo los siguientes pasos y como usuario root o haciendo uso de sudo(1):

  1. Averiguamos cual es el último UID/GID antes de crear nuestr@ usuari@
    • grep 100* /etc/group
    • grep 100* /etc/passwd
  2. Modificar la entrada del fichero /etc/passwd haciendo uso de vipw(8) añadiendo la información mínima para tener un(a) usuari@, vamos ha hacerlo con "pepito":
    • pepito:x:1004:1004::/home/pepito:/bin/bash
  3. Creamos un grupo para nuestro usuario /etc/group
    • pepito:x:1004:
  4. Creamos una entrada en /etc/shadow mediante haciendo uso de vipw -s: NOTA:Para saber que algoritmo cifrado utilizar, podemos comprobarlo en el fichero /etc/login.defs, en la variable ENCRYPT_METHOD lo que pasa que utiliza el sistema un salto o varios (lo desconocemos) para generar la contraseña a parte de la codificiación. Para visualizar el prefijo que necesitamos se puede consultar en man 3 crypt
    • $1$: MD5
    • $2a$: Blowfish
    • $5$: SHA-256
    • $6$: SHA-512

Sin embargo, es altamente recomendable generar una contraseña nueva haciendo uso del comando passwd(1), ya que esta genera la contraseña con el salto correcto, el algoritmo correcto y se genera automáticamente la entrada en /etc/shadow: passwd pepito

  1. Creamos el directorio: /home/nombre_usuari@
  2. Creamos el archivo: /var/spool/mail/nombre_usuari@
  3. Copiamos los archivos /etc/skel/* en /home/nombre_usuari@
  4. Fijamos los permisos correspondientes usuari@/grupo al directorio /home/nombre_usuari@ nombre_usuari@:grupo_usuari@ + chmod 700
  5. Declaramos los permisos chmod 660 /var/spool/mail/nombre_usuari@

Y listo, tendremos a nuestr@ usuari@ cread@. No obstante, este proceso, además de ser tedioso, complejo y propenso a errores, es preferible hacer uso de unos comandos que nos facilitan crearlo.

useradd(8)

Con este comando generamos un(a) usuari@ en ¡menos que canta un gallo! Todo lo que tenemos que hacer es:

sudo useradd pepito -m 
sudo passwd pepito

Y ya directamente tenemos usuari@ con su directorio /home y /var/spool/mail por defecto con sus correspondientes permisos, con la entrada correctamente creada en el fichero /etc/passwd, /etc/shadow y /etc/group listo para identificarse.

¿Fácil verdad? También hay que tener en cuenta, que la configuración por defecto del comando useradd(8) que se encuentra en /etc/default/useradd, ya que puede haber otras distribuciones que tengan otros parámetros, o directamente, no contenga ningún fichero y hay que especificarlo de forma manual tal que así:

sudo useradd pepito -m -k /etc/skel -U
sudo passwd pepito
  • -m: Genera un directorio en /home con el nombre de pepito
  • -k /etc/skel: Copia los archivos básicos para que funcione plenamente bash(1)
  • -U: Crea un grupo con el mismo nombre que el usuario

adduser(8)

Si no tenemos suficiente con el anterior, podemos hacer uso de adduser(8). Es un comando parecido al anterior, no hay mucha diferencia de usabilidad al menos en Linux. En FreeBSD, este comando tiene por defecto un asistente interactivo que nos va preguntando paso por paso cómo crearlo facilitándonos un poco la tarea. Este comando toma los valores para crear el usuario del fichero /etc/default/useradd como el comando anterior.

Ficheros implicados en el uso de ambos comandos

Según el man de ambos comandos, tenemos una serie de ficheros implicados cuando ejecutamos uno de los dos comandos para crear el o la usuari@.

  • /etc/passwd: Archivo clave con la información de la cuenta de usuari@
  • /etc/shadow: Información sobre la seguridad de la cuenta de usuari@
  • /etc/group: Grupos con sus correspondienes GID, usuari@s unid@s...
  • /etc/gshadow: Información relevante sobre la seguridad de los grupos
  • /etc/default/useradd: Esquema por defecto sobre cómo crear la cuenta de usuari@
  • /etc/skel/: Directorio que contiene ficheros por defecto para el/la usuari@
  • /etc/login.defs: Configuración del cifrado de las contraseñas, permisos...etc

¿Cómo autenticarse con un(a) usuari@ en nuestra sesión?

Si nos encontramos logeados mediante nuestr@ usuari@ rutinario, pero queremos acceder a otras cuentas del sistema, podemos hacerlo haciendo uso del comando su(1).

Estamos en la cuenta de pepito, y queremos pasar a la de susana.

su - susana

¿Cómo modificar la información de un(a) usuari@?

Tenemos un comando (¿Cómo no?), para modificar y actualizar la información de nuestr@ usuari@. Este comando se llama usermod(8). Entre otras cosas, nos permite bloquear una cuenta, actualizar y gestionar lá fecha de demora y fecha límite para cambiar la contraseña, añadir un usuario a grupos secundarios...

Por ejemplo, bloquear una cuenta

sudo usermod -L pepito

Si vemos el /etc/passwd, habrá añadido delante de la contraseña una (!), eso quiere decir que se encuentra bloqueada la cuenta.

Desbloqueando la cuenta:

sudo usermod -U pepito

Añadiendo un(a) usuari@ a un grupo nuevo

sudo usermod -a -G pepito video

Cambiando el grupo principal

sudo usermod -g users pepito

Modificando el shell del/la usuari@

sudo usermod -s /bin/bash pepito

Cambiando el directorio de trabajo

sudo usermod -d /srv pepito

Insertando un comentario

sudo usermod -c "Comentario" pepito

Podemos obtener más información accediendo al man(1) de usermod(8)

¿Cómo eliminar un(a) usuari@?

Como la mayor parte de las cosas en Linux o sistemas UNIX-like, se puede hacer prácticamente todo a mano, esto se puede hacer al sentido inverso cuando creamos el/la usuari@ en el sistema.

  1. Eliminar la entrada del usuario pepito de /etc/passwd haciendo uso de vipw(8)
  2. Destruir el directorio /home/pepito o el asignado, en caso de haber escogido otro directorio
  3. Eliminar el fichero del directorio /var/spool/mail/pepito
  4. Quitar el grupo que se creó junto con el/la usuari@ por defecto del fichero /etc/groups pero haciendo uso de vigr(8)

Y si queremos evitarnos tanta historia, bastará con hacer uso del comando userdel(8) Tan solo con ejecutar:

sudo userdel -r pepito

Habremos hecho todos los pasos anteriores con un sencillo comando.

¿Directorio de trabajo?

Tod@s l@s usuari@s poseen un entorno de trabajo por defecto que se encuentra en el directorio /home. Este entorno de trabajo contiene el nombre de la cuenta del/la usuari@ y le permite trabajar en él y que, por defecto, se van almacenando archivos de configuración de programas entre un largo etcétera.

¿Super usuario?

Existe un usuario por defecto creado en el sistema llamado root. Este usuario por defecto en todos los sistemas UNIX, UNIX-like como Liux, FreeBSD, Minix...etc tiene acceso a tod@s los archivos, carpetas, operaciones con dispositivos, procesos... del sistema. Es muy importante utilizarlo lo menos posible y nunca revelar su contraseña, o ejecutar aplicaciones sobre todo gráficas con este usuario.

Grupos

Por lo general, los grupos son agrupaciones de personas que tienen un objetivo en común, si bien pueden ser personas que tienen el mismo gusto por ver a su cantante favorito como obtener los mejores diseños de sus productos para una empresa. En nuestro caso, los grupos permiten formar un conjunto de usuari@s que desempeñen un rol determinado dentro del sistema. Creando, modificando documentos que ell@s hayan generado pero que otr@s que no pertenezca a dicho grupo no tengan permisos para hacerlo. Un usuario, o una usuaria puede formar parte de más de un grupo a la vez, pero por defecto, tienen un grupo primario al que pertenecen.

Los grupos como l@s usuari@s, contienen un ID que faciliten su recuperación dentro del sistema, en este caso se llama GID de Group Identifier o Identificador de grupo. El sistema por defecto tiene unos grupos ya asignados para determinadas actividades del mismo para diferentes tareas como el acceso a los dispositivos de audio y video entre otras cosas.

¿Grupos primarios?

Los grupos primarios son algo así como el grupo principal al que pertenece un/una usuari@. Cada archivo que cree o modifique deberá contener el mismo grupo o si no, no podrá hacerlo a menos que se encuentre añadido a un grupo secundario. Un grupo primario como su nombre indica, es el primer grupo al que pertenece y por ende solo podrá tener un GID asociado a la cuenta. Sin embargo, una cuenta de usuari@ puede pertenecer a muchos grupos secundarios.

¿Cómo Linux sabe qué hace una cosa y un grupo otra?

Existen una serie de ficheros clave que todo administrador debe saber que existen: * /etc/passwd: Contiene los nombres de usuario, contraseñas (en antiguas versiones que no usen shadow(5), UID, GID, descripción, directorio de trabajo y el intérprete de comandos que utilice. Cuando en el campo de la contraseña se encuentra una "x" quiere decir que hace uso del archivo /etc/shadow * /etc/shadow: Es un fichero que contiene todas las contraseñas ya sean de grupos o de usuari@s cifradas en un algoritmo determinado por el sistema, se utiliza para evitar que las contraseñas se puedan leer en /etc/passwd ya que tod@s l@s usuari@s tienen acceso lectura. Este archivo contiene: * Nombre de la cuenta de usuari@ * Contraseña encriptada, o bien puede incluir (!) que aparece como cuenta bloqueada en el sistema, un ejemplo de esto es cuando creamos una nueva cuenta sin haberle asignado una contraseña. * Fecha del último cambio de contraseña, si se encuentra vacío, es que no están habilitadas las gestiones de cuentas de l@s usuari@s. * Fecha mínima para efectuar un cambio de contraseña * Fecha máxima límite para modificar la contraseña * Periodo de aviso para cambiarla * Número de días con el usuario inactivo después de que haya expirado la contraseña * Fecha de expiración de la cuenta * Campo reservado * /etc/shadow-: Copia de seguridad del fichero anterior * /etc/group: Contiene nombre del grupo, contraseña (en caso de no usar shadow(5)), GID, lista de usuarios adjuntos

Son los archivos principales y que tod@s tenemos que tener hechos una copia de seguridad en caso de que falle el sistema o nos equivoquemos editando alguno de ellos.

NOTA: A pesar de no ser altamente recomendable su edición, si queremos editar a mano los ficheros passwd(5) o shadow(5) tenemos que utilizar los comandos vigr(1) para edición de grupos y vipw(1) para edición de los ficheros tanto passwd(5) como shadow(5).

¿Cómo crear un grupo?

Los grupos se pueden crear manualmente al igual que l@s usuari@s haciendo uso del comando vigr(8). No obstante, es preferible como siempre hacer uso de los comandos que nos faciliten las cosas más que nada para evitar incorrecciones de cualquier índole.

groupadd(8)

groupadd(8) es una bella herramienta con la que crear un grupo, edita el fichero /etc/group y a su vez actualiza el /etc/gshadow para añadir la contraseña asignada

Creando un grupo

sudo groupadd sysadmins

Creando un grupo con GID específico

sudo groupadd -g 1200 sysadmins 

Asignando contraseña a un grupo

sudo groupadd -p contraseña sysadmins

¿Cómo modificar un grupo?

Como podemos modificar l@s usuari@s, ¿Por qué no los grupos? Pues claro que sí podemos hacerlo con groupmod(8).

groupmod(8)

Este comando nos permitirá modificar cierta información de los grupos que tenemos como por ejemplo:

Cambiando el nombre del grupo

sudo groupmod -n devels sysadmins

Cambiando el GID

sudo groupmod -g 1203 devels

Modificando la contraseña

sudo groupmod -p "Contraseña" devels

¿Cómo eliminar el grupo?

También es otra operación que podemos hacer con vigr(8), pero es mejor utilizando este método.

sudo groupdel devels

¿Cómo cambiar temporalmente nuestr@ grupo primario?

Los usuarios siempre utilizamos un grupo primario que permite identificarnos con diversas partes o áreas del sistema. En caso de haber actualizado algo que requiera de una persona conectada al ordenador, se puede hacer pasar por la otra persona para saber que... Entonces existen una serie de restricciones intrínsecas como no editar un documento a la vez, si has instalado un software reciente que requiere permisos y por tanto reiniciar la sesión gráfica, se puede evitar.

Básicamente es gracias al comando newgrp(1)

newgrp finance

Y con esto, se activa nuestro grupo secundario como primario.

Visualizando los grupos en los que estoy

Se puede ver fácilmente haciendo uso del comando

groups

Comodín

Tenemos un pequeño comodín que nos permite modificar ciertas cosas de nuestr@ usuari@ o de un grupo en concreto como su contraseña. Esta herramienta se llama gpasswd(1) y la tenemos instalada por defecto.

Añadiendo un(a) usuari@ a un grupo

sudo gpasswd -a pepito users

Eliminando un(a) usuari@ de un grupo

sudo gpasswd -d pepito users

Suprimir contraseña en un grupo

sudo gpasswd -r users

Permisos

Poco sentido tiene diferenciar usuarios y grupos si no les atribuímos algún permiso especial que permita establecer una cierta jerarquía o distinción, ya que si no, estaríamos dejando un sistema horizontal en el que tod@s l@s usuari@s puedan hacer lo que quieran dentro del sistema. Aquí entra en juego el factor permisos.

Los permisos en UNIX se rigen por una serie de campos

  • Usuario: Solo el autor puede leer, escribir, ejecutar, o una combinación de los mismos, el poder en este caso sobre el fichero solo lo tiene él o ella o el usuario root.
  • Grupo: Tod@s l@s usuari@s que formen parte del grupo, dependiendo de los permisos que tenga establecido en este apartado el fichero o directorio podrán o no leer, escribir, o ejecutar en caso de ser un fichero ejecutable.
  • Todo el mundo: El resto de usuari@s del sistema que no pertenezcan ni al grupo, ni sea el autor del fichero, dependiendo de los permisos podrá o no acceder a los directorios y ficheros.

Imaginemos que tenemos el siguiente ejemplo:

Somos jefes(as) de un proyecto de desarrollo, y tenemos vari@s emplead@s a nuestro cargo. Nosotr@s como jefe(as) del proyecto, tenemos plena acción sobre todos los ficheros (somos autores). Y, seleccionamos determinados ficheros para determinados grupos, por ejemplo, todos aquellos ficheros que tengan que ver con el departamento de comunicación que tiene múltiples usuari@s, solo podrán acceder los de comunicación; el grupo de desarrolladores(as) tiene sus ficheros a cargo...etc Y cada usuari@ dentro de su grupo, tiene acceso pleno a los ficheros, sin embargo, las personas de otros grupos no pueden acceder a dichos archivos por las restricciones. Y luego, tenemos un apartado público, que solo podrá leer determinados archivos. ¡Voilá! hemos explicado el funcionamiento de usuarios y grupos de una forma sencilla.


               Jefes(as) de proyecto
                       \º/ \ª/
                          |
                  |-------------------|
                  | Contabilidad      |
                  | Directivas        |
                  | Contratos         |
                  |-------------------|
          ________________|______________
         /                               \
    Comunicación                     Desarrollo
      \º/ \ª/                          \º/ \ª/
         |                                |
  |-----------------|            |-----------------|
  | Inventario RRSS |            | Código fuente   |
  | Inversores      |            | Contraseñas OS  |
  | Media           |            | Servidores      |
  | ...             |            | ...             | 
  |-----------------|            |-----------------|
         |                                |
         |                          Todo el mundo
         |                          \º/ \ª/\º/ \ª/
         *------------------------->  \º/ \ª/\º/ 
                                        \ª/ \ª/
                                          |
                                    |-------------|
                                    | index.html  |
                                    | setup.sh    |
                                    | screenshots |
                                    | Twitter     |
                                    | Facebook    |
                                    | Google+     |
                                    |-------------|

Ahora vamos a traducir las palabras en el lenguaje que lo interpreta el sistema, tenemos hasta tres formas de conceder, modificar o leer permisos: * Formato verbal o por carácter: Se hacen uso de las letras para asignar, modificar o simplemente leer los permisos. * r: read solo lectura * w: writable solo escritura (debe ir acompañado de lectura para que pueda modificarse) * x: executable solo ejecutable (debe ir acompañado del permiso lectura para poder ejecutarse)

|        #         |  r   |  w |  x | rw   | rx   | wx   | rwx   |
|------------------|:-------------:|:-------------:|:-------------:|:----:|:----:|:----:|:-----:|
|    Usuario       | chmod u+r f1  |    u+w        | u+x           | u+rw | u+rx | u+wx | u+rwx |
|     Grupo        | chmod g+r f1  |    g+r        | g+x           | g+rw | g+rx | g+wx | g+rwx |
|   Todo el mundo  | chmod o+r f1  |    o+r        | o+x           | o+rw | o+rx | o+wx | o+rwx |
|      Tod@s       | chmod a+r f1  |    a+r        | a+x           | a+rw | a+rx | a+wx | a+rwx |
  • Formato numérico basado en Octal: Se hace uso del 1 al 7 para definir los permisos

    | # | r | w | x | rw | rx | wx | rwx | |------------------|:-------------:|:-------------:|:-------------:|:---:|:---:|:---:|:---:|:---:| | Usuario | 400 | 200 | 100 | 600 | 500 | 300 | 700 | | Grupo | 040 | 020 | 010 | 060 | 050 | 030 | 070 | | Todo el mundo | 004 | 002 | 001 | 006 | 005 | 003 | 007 | | Usuario + Grupo | 440 | 220 | 110 | 660 | 550 | 330 | 770 | | Grupo + Mundo | 044 | 022 | 011 | 066 | 055 | 033 | 077 | | Usuario + M | 404 | 202 | 101 | 606 | 505 | 303 | 707 | | Tod@s | 444 | 222 | 111 | 666 | 555 | 333 | 777 |

  • Mediante máscara: Esta es la forma menos común de declarar los permisos, pero también se utiliza. Para declarar un valor hay que hacer uso del comando umask(1p)

    Si queremos asignar el valor 022 a la máscara, este es el valor que le tendremos que restar al número actual de permisos que se encuentre en el directorio actual. Por ejemplo: * 002 = 777 - 002 = 775 (rwrwxr-x) * 444 = 644 - 444 = 200 (-w-------) * 020 = 660 - 020 = 640 (rw--r----) Para declarar el valor de una máscara se hace uso de umask(1p) tal que así: umask 020 Cuando se declara una máscara en un directorio, todos los archivos y rutas que se creen dentro de él, heredarán estos permisos. No es que se aplique directamente al archivo/directorio.

¿Cómo ver los permisos?

Para visualizar los permisos tenemos el magnífico comando ls(1) como hemos visto en el post de Mastering en Bash ~ Primeros pasos.

ls -al

Este comando muestra todos los archivos y directorios que se encuentren en el directorio actual además de los ocultos. En suma, muestra los enlaces tanto duros como simbólicos. En la siguiente salida, si nos fijamos en la primera columna de la izquierda veremos los permisos y el tipo de archivo.

lrwxrwxrwx.  1 sincorchetes sincorchetes    37 May 19 21:51  .steampath -> /home/sincorchetes/.steam/sdk32/steam
lrwxrwxrwx.  1 sincorchetes sincorchetes    35 May 19 21:51  .steampid -> /home/sincorchetes/.steam/steam.pid
drwxrwxr-x.  3 sincorchetes sincorchetes  4096 Mar  7 14:17  .subversion
-rw-rw-r--.  1 sincorchetes sincorchetes     8 Mar 28 22:29  .tasks
drwxrwxr-x.  2 sincorchetes sincorchetes  4096 Jan 20 04:25  .themes
drwx------.  3 sincorchetes sincorchetes  4096 Feb 12 01:10  .thumbnails
drwx------.  3 sincorchetes sincorchetes  4096 Jan 20 11:05  .thunderbird
drwxrwxr-x.  3 sincorchetes sincorchetes  4096 May 27 19:56  .tmux
-rw-rw-r--.  1 sincorchetes sincorchetes   370 May 27 19:57  .tmux.conf
drwxrwxr-x.  7 sincorchetes sincorchetes  4096 Jun  2 12:38  .vagrant.d
drwxr-xr-x.  2 sincorchetes sincorchetes  4096 Jun  4 17:08  Videos

Los archivos que contienen una "l" en los permisos denotan que son enlaces simbólicos y se puede además saber porque apuntan a otro directorio/fichero "->".

Aquellos que contienen una "d", denotan que son directorios y los que no contienen nada más que un "-" se interpretan como archivos.

Modificando la autoría de archivos/directorios

Como podemos ver, se pueden asignar múltiples permisos a los archiv@s, ahora bien, ¿Qué pasa si queremos cambiar el autor del fichero, el grupo o ambos?

Podemos hacerlo gracias al comando chown(1): * chown usuario fichero/directorio: Cambiando el autor del fichero y/o directorio * chown usuario:grupo: Cambiando el autor y el grupo al fichero y/o directorio

Se puede asignar un autor a un fichero y tener un grupo diferente, el autor podrá modificarlo, leerlo o ejecutarlo en cualquier momento, es indiferente.

Sticky Bit

¿Qué pasa si tenemos much@s usuari@s dentro de un grupo cuyo grupo tiene asignado un directorio de trabajo y el usuario "Pepe" crea un fichero y la usuaria "Susana" intenta eliminarlo? Que podrá hacerlo siempre y cuando, se aplique una restricción llamada "Sticky Bit" del inglés, "bit pegajoso". Este permiso especial, permite restringir los archivos creados y modificados por l@s miembr@s de un grupo y evitar que se genere un "autosabotaje" o un borrado por error.

Para habilitarlo bastará con efectuar:

chmod 1000 archivo/directorio

ó

chmod u+t archivo/directorio

Aplicar permisos recursivos en los ficheros y subdirectorios de un directorio

chmod 1000 -R directorio

Cuando ejecutemos un ls(1), veremos que en los permisos se habrá añadido un "t" al final tanto para directorios como para ficheros, esto nos indica la activación del Sticky Bit, también aparecerá modo de ejecución permitido. Si aparece una "T" en vez de una "t", esto quiere decir, que se ha activado el Sticky Bit pero solo para el usuario actual, si vemos el resultado, no contienen permisos de ejecución y por lo tanto no se permitirá crear archivos/directorios.

Salida con Sticky Bit activado:

ls -al
total 8
drwxrwxrwt. 2 root root  4096 Jun 11 07:41 .
drwxrwxrwt. 3 root users 4096 Jun 11 07:41 ..

Salida con Sticky Bit activado para el usuari@ actual:

ls -al
total 8
drwxrwxrwx. 2 root         users        4096 Jun 11 07:38 .
drwxrwxrwx. 3 sincorchetes sincorchetes 4096 Jun 11 07:37 ..
-rwxrw-rwT. 1 sincorchetes sincorchetes    0 Jun 11 07:38 12

Aquí os podemos mostrar con más claridad el funcionamiento:

SUID y SGUID

En Linux existen una serie de condiciones especiales para determinados ejecutables, archivos... que pueden editarse o ejecutarse sin ser el propietario de los mismos. Esta característica nos otorga una cierta ventaja como por ejemplo, si queremos cambiar la contraseña de nuestr@ usuari@ podemos hacerlo sin ser usuario "root".

Si nos fijamos en los permisos del comando passwd, veremos que tiene la letra "s" dentro de la ristra de permisos.

ls -al /usr/bin
-rwsr-xr-x. 1 root root         29008 Apr 12 11:24 passwd

Digamos que el/la usuari@ se hace pasar por "root" para intentar cambiar su contraseña y lo puede hacer gracias a estos permisos. Estos se llaman SUID Set User ID Bit o SGID Set Group ID Bit. Podemos verificar si un archivo o directorio lo tiene activado porque en los permisos del usuario tiene una "s" o en los permisos del grupo contiene "s". Solo el propietario del fichero/directorio puede declarar estos permisos "extendidos".

NOTA: En caso de contener una "S", esto quiere decir, que tanto el autor del archivo/directorio como el grupo y el resto del mundo no podrá editar, modificar y/o ejecutar archivos dentro del directorio. De hecho, veremos como se encuentra reducida la salida de permisos.

Referencias

Viendo el tiempo en tu terminal

¿Te gustaría ver el tiempo en tu terminal? No te gustan los plugins de los entornos de escritorio o usas un gestor de ventanas tipo i3wm que no tiene ningún icono en la bandeja de notificación de i3status.

Bueno pues no pasa nada, puedes ver el tiempo que hará en tu ciudad con tan solo ejecutar un curl al dominio wttr.in y por GeoIP te dará la climatología de tu lugar.

¿Qué puedes hacer?

  • Información de vuelta traducida a un idioma en concreto
  • Definir los días que queramos que nos devuelva (0 si es solo el día de hoy)
  • Definir la métrica, sistema internacional de unidades o sistema anglosajon
  • Calendario lunar
  • Buscar una ubicación
  • Convertir el resultado en un .png
  • Añadir transparencia a la imagen
  • Añadir un marco a la imagen que has generado

Visualizando en un sitio específico

curl wttr.in/Palma?1q

Devolverá algo tal que así:

Palma, Spain

    \  /       Partly cloudy
  _ /"".-.     6-7 °C         
    \_(   ).   ↘ 6 km/h       
    /(___(__)  10 km          
               0.2 mm         

En mi caso como es Palma, porque vivo en ella. ¿Qué pasa si quiero otra ciudad?

Pues puedes apoyarte de la ayuda:

[sincorchetes@keys0 ~]$ curl wttr.in/:help
Usage:

    $ curl wttr.in          # current location
    $ curl wttr.in/muc      # weather in the Munich airport

Supported location types:

    /paris                  # city name
    /~Eiffel+tower          # any location
    /Москва                 # Unicode name of any location in any language
    /muc                    # airport code (3 letters)
    /@stackoverflow.com     # domain name
    /94107                  # area codes
    /-78.46,106.79          # GPS coordinates

Special locations:

    /moon                   # Moon phase (add ,+US or ,+France for these cities)
    /moon@2016-10-25        # Moon phase for the date (@2016-10-25)

Units:

    m                       # metric (SI) (used by default everywhere except US)
    u                       # USCS (used by default in US)
    M                       # show wind speed in m/s

View options:

    0                       # only current weather
    1                       # current weather + 1 day
    2                       # current weather + 2 days
    F                       # do not show the "Follow" line
    n                       # narrow version (only day and night)
    q                       # quiet version (no "Weather report" text)
    Q                       # superquiet version (no "Weather report", no city name)
    T                       # switch terminal sequences off (no colors)

PNG options:

    /paris.png              # generate a PNG file
    p                       # add frame around the output
    t                       # transparency 150
    transparency=...        # transparency from 0 to 255 (255 = not transparent)

Options can be combined:

    /Paris?0pq
    /Paris?0pq&lang=fr
    /Paris_0pq.png          # in PNG the file mode are specified after _
    /Rome_0pq_lang=it.png   # long options are separated with underscore

Localization:

    $ curl fr.wttr.in/Paris
    $ curl wttr.in/paris?lang=fr
    $ curl -H "Accept-Language: fr" wttr.in/paris

Supported languages:

    da de fr fa id it nb nl pl ru (supported)
    az be bg bs ca cy cs el eo es et fi hi hr hu hy is ja jv ka kk ko ky lt lv mk ml nl nn pt ro sk sl sr sr-lat sv sw th tr te uk uz vi zh zu he (in progress)

Special URLs:

    /:help                  # show this page
    /:bash.function         # show recommended bash function wttr()
    /:translation           # show the information about the translators

Mostrando la fase lunar

[sincorchetes@keys0 ~]$ curl wttr.in/moon
                  ------------.  
              --'  o     . .   `--.  
            '   .    O   .       . `-.   
          @   @@@@@@@   .  @@@@@      `-.  
         @  @@@@@@@@@@@   @@@@@@@   .    \   
          o @@@@@@@@@@@   @@@@@@@       . \.   
        o   @@@@@@@@@@@.   @@@@@@@   O      \  
      @   .   @@@@@@@o    @@@@@@@@@@     @@@ \   
     @@@               . @@@@@@@@@@@@@ o @@@@|   
     @@  O  `.-./  .      @@@@@@@@@@@@    @@  \  First Quarter +
     @@    --`-'       o     @@@@@@@@ @@@@    |  4 14:22:41
     @@        `    o      .  @@   . @@@@@@@  |  Full Moon -
         @@  @         .-.     @@@   @@@@@@@  |  2  8:08:13
      @        @@@     `-'   . @@@@   @@@@  o /  
         @@   @@@@@ .           @@   .       |   
        @@@@  @\@@    /  .  O    .     o   . /   
         @@     \ \  /         .    .       /  
           .    .\.-.___   .      .   .-. /'   
                  `-'                `-' /   
             o   / |     o    O   .   .-'  
            .   /     .       .    .-'   
              --.       .      .--'  
                  ------------'  


Follow @igor_chubin for wttr.in updates

Referencias