Table of Contents
Apache httpd
apache apache2 httpd web http
Iniciar automaticamente en tiempo de arranque
1. Editar /etc/default/apache2, y como indica el propio fichero, dejar la linea tal que así:
'NO_START=0'
2. Reiniciar la máquina
3. Verificar que el servidor web se arrancó él solito
Seguridad
Por usuario y contraseña
Modificamos el virtualhost de: /etc/apache2/sites-enabled/
<Directory /home/web/datos> AuthType Basic AuthName "Restricted Files" AuthBasicProvider file AuthUserFile /etc/apache2/contrasenyas #si hay mas de un usuario lo separamos por espacios Require user usuario_acceso </Directory>
Para crear el fichero con usuarios al fichero contrasenyas:
# htpasswd -c /etc/apache2/contrasenyas usuario_acceso
Una vez creado el fichero, MUY IMPORTANTE no poner la opcion -c, para añadir los siguientes usuarios:
# htpasswd /etc/apache2/contrasenyas usuario_segundo
Acceso por IP
Añadir la directiva:
Order deny,allow Deny from all Allow from dev.example.com Allow from 10.0.0.0/8
Mezclar las dos directivas
Con la opción Satisfy se mezclan las dos opciones.
All: se tiene que cumplir usuario e ip Any: se tiene que cumplir una de las dos
<Directory /> Options Indexes FollowSymLinks Multiviews AllowOverride None AuthType Basic AuthName "Usuari i contrasenya" AuthUserFile /etc/apache2/contrasenyes Require user hacklab Deny from All Allow from 10.0.0.0/8 Satisfy Any </Directory>
Hacer peticiones a un servidor apache con Telnet
http://www.apacheweek.com/features/http11
# telnet google.com 80
Trying 173.194.34.209... Connected to google.com. Escape character is '^]'.
GET / HTTP/1.0
HTTP/1.0 302 Found Location: http://www.google.es/ Cache-Control: private Content-Type: text/html; charset=UTF-8 Set-Cookie: PREF=ID=b417d3365d4d7c94:FF=0:TM=1328183646:LM=1328183646:S=Zm54DaCFzY3Q2kxB; expires=Sat, 01-Feb-2014 11:54:06 GMT; path=/; domain=.google.com Date: Thu, 02 Feb 2012 11:54:06 GMT Server: gws Content-Length: 218 X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <TITLE>302 Moved</TITLE></HEAD><BODY> <H1>302 Moved</H1> The document has moved <A HREF="http://www.google.es/">here</A>. </BODY></HTML> Connection closed by foreign host.
Proxy inverso
Habilitar módulos
Hay que habilitar los módulos creando los enlaces simbólicos:
# cd /etc/apache2/mods-enabled
# ln -s ../mods-available/proxy_http.load # ln -s ../mods-available/proxy.load # ln -s ../mods-available/proxy.conf # ln -s ../mods-available/rewrite.load
# ls -la proxy_http.load -> ../mods-available/proxy_http.load proxy.load -> ../mods-available/proxy.load proxy.conf -> ../mods-available/proxy.conf rewrite.load -> ../mods-available/rewrite.load
También lo podemos habilitar con el comando:
# a2enmod proxy_http
Considering dependency proxy for proxy_http: Enabling module proxy. Enabling module proxy_http. To activate the new configuration, you need to run: service apache2 restart
Creando el virtual Host
Redirigimos todas las peticiones de mldonkey.lobo99.com a http://localhost:4080/, así podemos acceder a ese puerto desde el 80, por si en estamos detrás de nu proxy que está capado.
<VirtualHost *:80> ServerName mldonkey.lobo99.com ProxyPass / http://localhost:4080/ ProxyPassReverse / http://localhost:4080/ </VirtualHost>
Permisos
Si nos da un error 403 Forbidden, pTenemos que dar permisos en el fichero:
/etc/apache2/mods-enabled/proxy.conf
ProxyRequest off
<Proxy *> AddDefaultCharset off Order deny,allow #Deny from all Allow from all </Proxy>
Conexión SSL
Si queremos redirigir a una web https tenemos que habilitar los siguientes módulos:
/etc/apache2/mods-enabled
proxy_connect.load -> ../mods-available/proxy_connect.load ssl.load -> ../mods-available/ssl.load ssl.conf -> ../mods-available/ssl.conf
En la configuración del VirtualHost tenemos que poner:
<VirtualHost *:80> ServerName admin.lobo99.com ProxyRequests off SSLProxyEngine on ProxyPass / https://localhost:10000/ ProxyPassReverse / https://localhost:10000/ </VirtualHost>
SSL
Habilitar los módulos de ssl en apache
1. Habilitar modulo SSL
sudo a2enmod ssl
2. Generamos certificado:
openssl req $@ -newkey rsa:4096 -new -x509 -days 3650 -nodes -out /etc/apache2/apache.pem -keyout /etc/apache2/apache.key
Otra forma:
openssl req -new -x509 -days 365 -sha1 -newkey rsa:1024 -nodes -keyout server.key -out server.crt
# -x509 identifies that a certificate is required, rather than just a certificate request (see below). # -days 365 sets the certificate to expire in a year. You may want to extend this period. Make a note of the expiry date so that you can renew it when necessary! # -sha1 specifies that SHA1 encryption should be used. # rsa:1024 sets the key as 1024 bit RSA. # -nodes specifies no passphrase. # -keyout and -out specify where to store the certificate and key. The key should be root-readable only; the certificate can be world-readable, and must be readable by the user that Apache runs as.
Rellenamos los datos
Country Name (2 letter code) [AU]:ES State or Province Name (full name) [Some-State]:Barcelona Locality Name (eg, city) []:Mataro Organization Name (eg, company) [Internet Widgits Pty Ltd]:prueba Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []: Email Address []:
sudo chmod 600 /etc/apache2/apache.pem
<VirtualHost *:443> ServerAdmin admin@midominio.com DocumentRoot /var/www/ SSLEngine on SSLCertificateFile /etc/apache2/apache.pem SSLCertificateKeyFile /etc/apache2/apache.key
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown Options FollowSymLinks Options Indexes FollowSymLinks MultiViews # This directive allows us to have apache2's default start page # in /apache2-default/, but still have / go to the right place # RedirectMatch ^/$ /mail/ ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ ErrorLog /var/log/apache2/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog /var/log/apache2/access.log combined ServerSignature On Alias /doc/ "/usr/share/doc/" </VirtualHost>
Configurar autenticación con certificado personal
Primero creamos la CA en el servidor
openssl genrsa -out ca.key 1024
Luego una petición de certificado y lo firmamos:
openssl req -new -key ca.key -out ca.csr openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt
Ahora creamos el certificado para el apache:
openssl genrsa -out server.key 1024 openssl req -new -key server.key -out server.csr openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Cliente
Se genera un certificado que tiene que firmar la CA del servidor. Por ejemplo se puede crear desde un pc del usuario
Primero se genera la clave privada:
openssl genrsa -out client.key 1024
Luego una request de certificado:
openssl req -new -key client.key -out client.csr -config openssl.cnf
Se envía esta request al server para que la firme. Desde el servidor se firma:
openssl x509 -req -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt
Creamos el certificado con la clave privada y la clave pública:
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
Ahora importamos el p12 en el navegador
He tenido que añadir esto en virtualhost para que valide el certificado:
SSLCACertificateFile /etc/apache2/ca/ca.crt
Ahora en el servidor configuramos apache para que pida el certificado:
<Location /cert> SSLRequireSSL SSLVerifyClient require SSLVerifyDepth 10 </Location>
Podemos poner mas restricciones, por ejemplo por IP o por OU
<Location /cert> SSLVerifyClient optional SSLVerifyDepth 4 SSLOptions +ExportCertData +StdEnvVars +StrictRequire SSLRequire ****condiciones de validación***** </Location>
Una de las condiciones de validación puede ser: Por OU SSLRequire %{SSL_CLIENT_S_DN_OU} in {“LEGIDO”} Por IP:
SSLRequire %{REMOTE_ADDR} =~ m/^2\.139\.211\.[0-9]+$/
Sacar información de un certificado:
# openssl x509 -in cacert.pem -noout -text
Certificate: Data: Version: 3 (0x2) Serial Number: 0 (0x0) Signature Algorithm: sha1WithRSAEncryption Issuer: C=ES, ST=ES, O=ES, OU=ES, CN=ES Validity Not Before: Dec 23 17:10:23 2010 GMT Not After : Dec 22 17:10:23 2013 GMT Subject: C=ES, ST=ES, O=ES, OU=ES, CN=ES Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:e2:d2:9d:1f:30:d2:bf:85:ba:ac:5b:c1:20:18: 20:18:ef:8a:bd:11:fc:3b:24:e0:d1:b2:3f:cb:23: 3b:95:20:7f:07:3b:92:95:55:e1:90:7c:61:7d:47: 43:75:d3:a7:cd:19:fa:32:31:eb:d6:80:38:84:ed: 70:21:39:3b:c7:d3:f5:cc:4c:75:85:81:9c:43:91: 47:b1:12:3a:76:22:e0:33:6f:ee:10:a1:37:5d:b6: d8:15:7e:d6:23:27:f5:a2:f6:b2:fe:ec:d6:7e:6d: b8:d8:0b:cb:9f:4a:4f:a4:e7:cd:da:69:10:02:fe: 31:0f:1b:9f:75:2c:cf:f8:89 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Subject Key Identifier: E5:29:4E:27:24:7C:9A:5E:AA:9A:5D:E3:2B:62:F4:D6:59:AB:3D:59 X509v3 Authority Key Identifier: keyid:E5:29:4E:27:24:7C:9A:5E:AA:9A:5D:E3:2B:62:F4:D6:59:AB:3D:59 DirName:/C=ES/ST=ES/O=ES/OU=ES/CN=ES serial:00 X509v3 Basic Constraints: CA:TRUE Signature Algorithm: sha1WithRSAEncryption 3f:27:f3:4f:8b:2e:57:68:8c:59:53:2f:54:c6:f9:e6:5d:59: fd:42:4f:c6:1d:8e:d7:15:f4:92:45:23:fb:ee:c9:38:c3:b1: 7d:74:94:da:70:ee:3b:56:12:db:8a:35:70:d3:f8:8f:4e:ea: db:d1:17:35:b0:2e:15:d0:32:97:82:0e:ae:9c:17:0e:82:49: 06:84:55:a9:be:e2:7b:09:ca:13:82:f3:2e:a8:dc:6f:fb:de: 55:40:9f:70:bd:61:f0:f4:3c:2f:ad:91:d4:ff:e9:cf:12:a4: 76:8f:7c:4d:f8:e0:12:d2:8e:5f:b7:d6:7c:f5:88:b6:db:c4: c1:44
################################ Revisar ##############################
aptitude update && aptitude install ssl-cert
make-ssl-cert generate-default-snakeoil –force-overwrite
/etc/cups/ssl/server.crt /etc/ssl/certs/ca-certificates.crt
/etc/ssl/certs/ssl-cert-snakeoil.pem /etc/ssl/private/ssl-cert-snakeoil.key
a2enmod ssl
apache2ctl restart
netstat -tpan | grep 443 tcp6 0 0 :::443 :::* LISTEN 1625/apache2
Extraer certificados de firefox
Miramos cual es nuestro kesytore en firefox:
# ls -1d $HOME/.mozilla/firefox/*default
/home/jose/.mozilla/firefox/az0qqip1.default
Ahora sacamos los nombres de los certificados:
# certutil -L -h 'Builtin Object Token' -d /home/jose/.mozilla/firefox/az0qqip1.default
Certificate Nickname Trust Attributes SSL,S/MIME,JAR/XPI Builtin Object Token:GTE CyberTrust Root CA ,, Builtin Object Token:GTE CyberTrust Global Root C,C,C Builtin Object Token:Thawte Personal Freemail CA ,C, Builtin Object Token:Thawte Server CA C,,C Builtin Object Token:Thawte Premium Server CA C,,C
Y ahora sacamos un certificado. Cuidadin con los espacios:
eval certutil -d /home/jose/.mozilla/firefox/az0qqip1.default -L -n "Builtin\ Object\ Token:GTE\ CyberTrust\ Root\ CA" -a
[opensc-pkcs11] ctx.c:367:load_dynamic_driver: dynamic library '/usr/lib64/libopensc-dnie.so': invalid module version [opensc-pkcs11] ctx.c:467:load_card_drivers: Unable to load 'dnie'. [opensc-pkcs11] reader-pcsc.c:906:pcsc_detect_readers: SCardEstablishContext failed: 0x8010001d [opensc-pkcs11] reader-pcsc.c:1015:pcsc_detect_readers: returning with: No readers found [opensc-pkcs11] reader-pcsc.c:906:pcsc_detect_readers: SCardEstablishContext failed: 0x8010001d [opensc-pkcs11] reader-pcsc.c:1015:pcsc_detect_readers: returning with: No readers found -----BEGIN CERTIFICATE----- MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgwFgYD VQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRydXN0IFJv b3QwHhcNOTYwMjIzMjMwMTAwWhcNMDYwMjIzMjM1OTAwWjBFMQswCQYDVQQGEwJV UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMRwwGgYDVQQDExNHVEUgQ3liZXJU cnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC45k+625h8cXyv RLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8KDPufpz+iCWaEVh43KRuH6X4M ypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPwKfWVWgkWYXcKIiXUT0Wqx73llt/5 1KiOQswkwB6RJ0q1bQaAYznEol44AwIDAQABMA0GCSqGSIb3DQEBBAUAA4GBABKz dcZfHeFhVYAA1IFLezEPI2PnPfMD+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWl IjeaY8JIILTbcuPI9tl8vrGvU9oUtCG41tWW4/5ODFlitppK+ULdjG+BqXH/9Apy bW1EDp3zdHSo1TRJ6V6e6bR64eVaH4QwnNOfpSXY -----END CERTIFICATE-----
Comprobar una web por https
Lo podemos hacer con openssl client simply. Nos podemos encontrar dos tipos de errores:
Certificado autofirmado
Error por wget:
# wget https://aca-web.gencat.cat/eines/gestio
--2011-02-02 17:02:26-- https://aca-web.gencat.cat/eines/gestio Resolving aca-web.gencat.cat... 83.247.130.118 Connecting to aca-web.gencat.cat|83.247.130.118|:443... connected. ERROR: cannot verify aca-web.gencat.cat's certificate, issued by "/C=ES/O=Agencia Catalana de Certificacio (NIF Q-0801176-I)/L=Passatge de la Concepcio 11 08008 Barcelona/OU=Serveis Publics de Certificacio ECV-2/OU=Vegeu https://www.catcert.net/verCIC-2 (c)03/OU=Secretaria d'Administracio i Funcio Publica/CN=EC-SAFP": Self-signed certificate encountered. To connect to aca-web.gencat.cat insecurely, use '--no-check-certificate'.
Error por openssl:
# openssl s_client -connect aca-web.gencat.cat:443 -debug
Verify return code: 19 (self signed certificate in certificate chain)
Solución:
Exportamos la cadena de certificados desde firefox por ejemplo y lo grabamos como aca-web.gencat.cat_cadena.pem
Ahora hacemos:
# wget --ca-certificate=aca-web.gencat.cat_cadena.pem https://aca-web.gencat.cat/eines/gestio
# openssl s_client -connect aca-web.gencat.cat:443 -debug -CAfile aca-web.gencat.cat_cadena.pem
Certificado emitido a otro nombre
# wget https://www.indymedia.org
--2011-02-03 10:19:35-- https://www.indymedia.org/ Resolviendo www.indymedia.org... 72.232.204.178 Conectando a www.indymedia.org|72.232.204.178|:443... conectado. ERROR: certificate common name «chavez.indymedia.org» doesn't match requested host name «www.indymedia.org». Para conectar con www.indymedia.org de forma no segura, use «--no-check-certificate».
WebDAV
1. Enlaces simbólicos:
cd /etc/apache2/mods-enabled
ln -s ../mods-available/dav_fs.conf dav_fs.conf
ln -s ../mods-available/dav_fs.load dav_fs.load
ln -s ../mods-available/dav.load dav.load
ln -s ../mods-available/dav_lock.load dav_lock.load
2. Ruta a la bd. Añadir a apache2.conf esto:
DavLockDB /var/log/apache2/dav_lock_db
3. Crear esa ruta.
cd /var/log touch dav_lock_db
4. Habilitar soporte dav. Añadir al directorio x en apache2.conf:
Dav on
5. Reiniciar apache
apachectl restart
6. Descargar el cliente unix con soporte dav cadaver:
http://packages.debian.org/unstable/web/cadaver
6. Instalarlo:
dpkg -i cadaver_xxx
7. Intentar la conexión:
cadaver –proxy=proxyvip:8080 http://87.223.245.32
De momento no sale
Virtualhosts
Antecedentes:
-Tenemos un servidor apache 2.x corriendo
-Tenemos ip dinámica, que en este caso resuelve dyndns.com
-Queremos tener más de un dominio a la vez (p.ej):
.dominio_1.mine.nu
.dominio_2.mine.nu
Cada uno de estos dominios apunta a un directorio distinto del servidor donde corre apache
1. cd /etc/apache2/sites-available
2. touch dominio_1
3. vim dominio_1
4. Pegar lo siguiente:
NameVirtualHost * <VirtualHost *> ServerName dominio_1.mine.nu ServerAdmin webmaster@localhost DocumentRoot /ruta/dominio_1/ <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /ruta/dominio_1/> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> </VirtualHost>
6. wq (grabar el fichero y salir)
7. touch dominio_2
8. vim dominio_2
9. Pegar lo siguiente:
NameVirtualHost * <VirtualHost *> ServerName dominio_2.mine.nu ServerAdmin webmaster@localhost DocumentRoot /ruta/dominio_2/ <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /ruta/dominio_2/> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> </VirtualHost>
10. wq (grabar el fichero y salir)
11. Habilitamos dominio_1
ln -s dominio_1 ../sites-enabled/dominio_1
12. Habilitamos dominio_2
ln -s dominio_2 ../sites-enabled/dominio_2
13. Creo que con eso ya está, pero por si acaso recargamos apache2
apache2ctl restart
Modulos
- Listar modulos:
sudo apachectl -t -D DUMP_MODULES Loaded Modules: core_module (static) log_config_module (static) logio_module (static) mpm_prefork_module (static) http_module (static) so_module (static) alias_module (shared) auth_basic_module (shared) authn_file_module (shared) authz_default_module (shared) authz_groupfile_module (shared) authz_host_module (shared) authz_user_module (shared) autoindex_module (shared) cgi_module (shared) deflate_module (shared) dir_module (shared) env_module (shared) mime_module (shared) negotiation_module (shared) php5_module (shared) reqtimeout_module (shared) setenvif_module (shared) Syntax OK
- Obtener el nombre del modulo necesario para los comandos 'a2dismod' o 'a2enmod':
sudo a2enmod Your choices are: actions alias asis auth_basic auth_digest authn_alias authn_anon authn_dbd authn_dbm authn_default authn_file authnz_ldap authz_dbm authz_default authz_groupfile authz_host authz_owner authz_user autoindex cache cern_meta cgi cgid charset_lite dav dav_fs dav_lock dbd deflate dir disk_cache dump_io env expires ext_filter file_cache filter headers ident imagemap include info ldap log_forensic mem_cache mime mime_magic negotiation php5 proxy proxy_ajp proxy_balancer proxy_connect proxy_ftp proxy_http proxy_scgi reqtimeout rewrite setenvif speling ssl status substitute suexec unique_id userdir usertrack version vhost_alias Which module(s) do you want to enable (wildcards ok)?
- Deshabilitar modulo:
sudo a2dismod status Module status disabled. Run '/etc/init.d/apache2 restart' to activate new configuration!
Y recargamos configuracion:
sudo apachectl graceful
Habilitar campos "last modified" etc. en listado de directorios
En la imagen de docker por defecto NO aparecen esos atributos. Cambios:
/usr/local/apache2/conf/httpd.conf
Descomentar esta linea:
Include conf/extra/httpd-autoindex.conf
Redirecciones
- El dominio raiz (y solo el dominio raiz) se redirecciona a otra URL y se para de procesar mas reglas
- Se pasan todas las peticiones a un backend Tomcat
RewriteEngine on RewriteRule ^/$ http://example.com/my-tomcat-app1/ [R=301,L] ProxyRequests off ProxyPreserveHost on ProxyPass / http://localhost:8080/ ProxyPassReverse / http://localhost:8080/
Herramientas online útiles
- Para generar:
https://websiteadvantage.com.au/HtAccess-301-Redirect-Generator#heading-ToolResult
- Para detectar qué regla se aplica en función de la url que se pone: