tag:blogger.com,1999:blog-30040841756246193972024-03-05T05:25:16.527+01:00Blai BlogUnknownnoreply@blogger.comBlogger211125tag:blogger.com,1999:blog-3004084175624619397.post-89213821900278724192023-10-04T15:29:00.012+02:002023-10-04T15:34:58.371+02:00Comprobar si un usuario pertenece a un grupo<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW72We9C7c9NwF7viPMrTQ6aGqr8TrxBlG_RwEgwWpA-iu5mL94ejiKUf9fK3jMzmhTz3lCuTWSKjJN3ciJuHFgrS3RLK3bAqfydNdKmbQkH0Yov0u1u9FEksRTyNPEN_5f0b29lnqy8Y/s1600/powershell.png" data-original-width="200" data-original-height="200" style="display:none" />
<span class="subtitulo">Cómo verificar si un usuario pertenece a un grupo de Active Directory con PowerShell.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipMjruKb3xXz__0YqD4oT1GYwcm5Bbbi9D58IpJkKWIJo97b8voXxHD_eD_uyz0UDfnbYTBflfRKDFgr1Hnny284q5vfk5bxZjjipXj7jINijlvBSf2rhaJvHf3KiNmRcuLwJJ7SN_yb4/s1600/powershell.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipMjruKb3xXz__0YqD4oT1GYwcm5Bbbi9D58IpJkKWIJo97b8voXxHD_eD_uyz0UDfnbYTBflfRKDFgr1Hnny284q5vfk5bxZjjipXj7jINijlvBSf2rhaJvHf3KiNmRcuLwJJ7SN_yb4/s1600/powershell.png" width="100%" /></a>
<br />
<br />
Imaginemos que tenemos un archivo de texto con una lista de usuarios de Active Directory y queremos saber si esos usuarios son miembros de un grupo.
<br />
<br />
Podemos leer el archivo, en el cual cada usuario debe ocupar una línea, y verificar que el usuario sea miembro del grupo, con un script de PowerShell.
<br />
<br />
Para ello, podemos ejecutar el siguiente script desde un controlador de dominio:
<br />
<br />
<!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #996633">$groupName</span> = <span style="background-color: #fff0f0">"Grupo"</span>
<span style="color: #996633">$userList</span> = <span style="color: #007020">Get-Content</span> -Path <span style="background-color: #fff0f0">"C:\Scripts\usuarios-origen.txt"</span>
<span style="color: #996633">$outputFilePath</span> = <span style="background-color: #fff0f0">"C:\Scripts\usuarios-en-grupo.txt"</span>
<span style="color: #008800; font-weight: bold">foreach</span> (<span style="color: #996633">$user</span> <span style="color: #008800; font-weight: bold">in</span> <span style="color: #996633">$userList</span>) {
<span style="color: #996633">$isMember</span> = <span style="color: #007020">Get-ADUser</span> <span style="color: #996633">$user</span> | <span style="color: #007020">Get-ADPrincipalGroupMembership</span> | <span style="color: #007020">Where-Object</span> { <span style="color: #996633">$_</span>.Name <span style="color: #333333">-eq</span> <span style="color: #996633">$groupName</span> }
<span style="color: #008800; font-weight: bold">if</span> (<span style="color: #996633">$isMember</span>) {
<span style="background-color: #fff0f0">"$user"</span> | <span style="color: #007020">Tee-Object</span> -FilePath <span style="color: #996633">$outputFilePath</span> -Append
}
}
</pre></div>
<br />
El nombre del grupo es "Grupo" y debe especificarse dentro de la variable "$groupName".
<br />
<br />
La ruta con el archivo de texto que contiene la lista de usuarios debe especificarse en "$userList".
<br />
<br />
Asimismo, el script usa el cmdlet "Tee-Object" el cual muestra por pantalla el output al mismo tiempo que lo graba en un archivo de texto, en este caso, el especificado en la variable "$outputFilePath".Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-46042850937303938182022-12-14T11:06:00.026+01:002022-12-15T18:36:52.560+01:00Eliminar miembros de un grupo de Active Directory<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW72We9C7c9NwF7viPMrTQ6aGqr8TrxBlG_RwEgwWpA-iu5mL94ejiKUf9fK3jMzmhTz3lCuTWSKjJN3ciJuHFgrS3RLK3bAqfydNdKmbQkH0Yov0u1u9FEksRTyNPEN_5f0b29lnqy8Y/s1600/powershell.png" data-original-width="200" data-original-height="200" style="display:none" />
<span class="subtitulo">Cómo eliminar automáticamente mimebros de un grupo de Active Directory con PowerShell.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipMjruKb3xXz__0YqD4oT1GYwcm5Bbbi9D58IpJkKWIJo97b8voXxHD_eD_uyz0UDfnbYTBflfRKDFgr1Hnny284q5vfk5bxZjjipXj7jINijlvBSf2rhaJvHf3KiNmRcuLwJJ7SN_yb4/s1600/powershell.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipMjruKb3xXz__0YqD4oT1GYwcm5Bbbi9D58IpJkKWIJo97b8voXxHD_eD_uyz0UDfnbYTBflfRKDFgr1Hnny284q5vfk5bxZjjipXj7jINijlvBSf2rhaJvHf3KiNmRcuLwJJ7SN_yb4/s1600/powershell.png" width="100%" /></a>
<br />
<br />
Tenemos un grupo de usuaros de Active Directory con cientos de miembros. Queremos eliminar varios miembros de golpe, por ejemplo 50 miembros, y no queremos hacerlo manualmente.
<br />
<br />
Para automatizar el eliminado de miembros de un grupo de Active Directory podemos usar un script de PowerShell con la función Remove-ADGroupMember:
<br />
<br />
<!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #996633">$users</span> = <span style="color: #007020">Get-Content</span> <span style="background-color: #fff0f0">"C:\Temp\mimebros.csv"</span>
<span style="color: #008800; font-weight: bold">foreach</span> (<span style="color: #996633">$user</span> <span style="color: #008800; font-weight: bold">in</span> <span style="color: #996633">$users</span>) {
<span style="color: #996633">$obj</span> = <span style="color: #007020">Get-ADUser</span> <span style="color: #996633">$user</span>
<span style="color: #007020">Remove-ADGroupMember</span> -ID Nombre_Grupo -Members <span style="color: #996633">$obj</span> -Confirm:<span style="color: #996633">$false</span>
}
</pre></div>
<br />
Dentro de miembros.csv se debe escribir un nombre de usuario en cada línea.
<br />
<br />
Lo que hace el script es leer línea a línea el archivo csv y para cada línea, es decir, para cada usuario, eliminarlo del grupo "Nombre_Grupo" sin pedir confirmación.
<br />
<br />
Una vez ejecutado el script, los usuarios contenidos en el archivo csv ya no aparecerán en el grupo llamado "Nombre_Grupo".Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-73106182640490637082022-11-02T16:21:00.007+01:002022-12-15T18:47:15.471+01:00Unable to open primary script (Permission denied)<img border="0" data-original-height="200" data-original-width="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4JF7SgytM81BbNniaOKyDwZMf2PlLMyC5VgexA3cWkGgQw8btV9L85UO0iUo-4r-ni8LDVs0e3yVDoNw2Jo4tXm4as0uUpyWt3M4LjnE-HZXFeOVD-PkGD1LlmI6gxzdHQf16OfrmimM/s1600/nginx.png" style="display: none;" /><span class="subtitulo">Cómo configurar nginx para funcionar como webserver en SLES 15.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh47tZ_GPJH5zmvfORkTBv_LDL4QmadQIRO2h7BTVc_UdCydf2L4Sdqcr_LHySKJ_20s5OuHBJ3Yj0Df-3JtYd4_YlZMbXvD_HhcJR5vSssbWoYOG07PMD12KWXLGjpXvKXaRx31Wh2PBc/s1600/nginx.png"><img border="0" class="center" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh47tZ_GPJH5zmvfORkTBv_LDL4QmadQIRO2h7BTVc_UdCydf2L4Sdqcr_LHySKJ_20s5OuHBJ3Yj0Df-3JtYd4_YlZMbXvD_HhcJR5vSssbWoYOG07PMD12KWXLGjpXvKXaRx31Wh2PBc/s1600/nginx.png" width="100%" /></a>
<br />
<br />
Instalé NGINX en un SLES 15 SP4 para hospedar una web, pero al ir a ver el index.php me encontré con el siguiente mensaje de error en el navegador:
<br />
<br />
An error occurred.
<br />
<br />
<i>Sorry, the page you are looking for is currently unavailable.<br />
Please try again later.</i>
<br />
<br />
<i>If you are the system administrator of this resource then you should check the error log for details.
</i><br />
<br />
<i>Faithfully yours, nginx.</i>
<br />
<br />
Al mirar los logs de error de nginx vi:
<br />
<br />
<div class="terminal">FastCGI sent in stderr: "Unable to open primary script: /srv/www/htdocs/index.php (Permission denied)"
*3 FastCGI sent in stderr: "Unable to open primary script: /srv/www/htdocs/index.php (Permission denied)" while reading response header from upstream, client: 1.1.1.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "web.com"
</div>
<br />
Después de jugar con permisos durante algunas horas, di con que podría ser un problema de AppArmor, pero deshabilitarlo no surgió efecto.
<br />
<br />
Lo que sí funcionó fue poner AppArmor en modo "aa-complain" para php-fpm:
<br />
<br />
<div class="terminal">HOST # aa-complain php-fpm
Setting /usr/sbin/php-fpm to complain mode.
Warning: profile php-fpm represents multiple programs
Warning: profile php-fpm represents multiple programs
</div>
<br />
Una vez hecho esto, reinicié el servicio nginx y la web empezó a funcionar :)
<br />
<br />
<br />
Fuentes:
<br />
<br />
<a href="https://documentation.suse.com/sles/15-SP4/html/SLES-all/cha-apparmor-intro.html" target="_blank">https://documentation.suse.com/sles/15-SP4/html/SLES-all/cha-apparmor-intro.html</a>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-53514763782696769922022-08-31T09:53:00.048+02:002022-08-31T13:24:37.871+02:00Ver parches instalados en un SUSE Linux<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL5TfN9bi14Wt_h2KKvZgZQsMdPllR3DZUzqDM6p3bekp_JOrOptPI11bzcg2LjwkcSQkdqaGqYLQtftHSTGEnrPEpICuTF64f_7hKrPKdArBYpJ-8owVNATcO5z_mkZVAv8pm3aktU-E/s1600/suse.png" style="display: none">
<span class="subtitulo">Cómo ver el historial de todos los parches instalados en SLES (SUSE Linux Enterprise Server).</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3YrtNe9Zc6gigiwpZL1IWcYCil9ZKYK3dEEXuJozg7Eyx4IaQVeq_n4UpYxi5WbLqRn7DhtAav86eqzrqvXLTik-i5B57VvWXo9BVunHRith_R2R1yISyj3AERlb4JnBllzTuKj2e29Y/s1600/suse.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3YrtNe9Zc6gigiwpZL1IWcYCil9ZKYK3dEEXuJozg7Eyx4IaQVeq_n4UpYxi5WbLqRn7DhtAav86eqzrqvXLTik-i5B57VvWXo9BVunHRith_R2R1yISyj3AERlb4JnBllzTuKj2e29Y/s1600/suse.png" width="100%" class="center" /></a>
<br />
<br />
En una auditoría de seguridad me pidieron que presentara un listado que mostrara todos los parches instalados en un sistema SUSE Linux Enterprise Server durante el año en curso. Tras investigar un poco, di con las siguientes maneras de encontrar dicha información.
<br />
<br />
<br />
<h2>Histórico</h2>
<br />
SLES guarda un histórico de actualizaciones en /var/log/zypp/history:
<br />
<br />
<div class="terminal">HOST # cat /var/log/zypp/history
2022-08-31 12:08:56 | install | hwinfo | 21.82-150300.3.3.1 | x86_64 ||Basesystem_Module_15_SP3_x86_64:SLE-Module-Basesystem15-SP3-Updates|4cb0aad9e2148b3290877e3903a9792bfb31bfc7b9cb883a5088b6e04387d682|
2022-08-31 12:08:57 | install | glibc-locale-base | 2.31-150300.37.1 | x86_64 ||Basesystem_Module_15_SP3_x86_64:SLE-Module-Basesystem15-SP3-Updates|e13d47fd5e6a0cc73f5c469d16360b40c7c77ae560425c34c96e5fd67e8edae6|
2022-08-31 12:08:57 | install | glibc-lang | 2.31-150300.37.1 | noarch ||Basesystem_Module_15_SP3_x86_64:SLE-Module-Basesystem15-SP3-Updates|17185b24afb65caf58422923d28942ea7dc08efba88fde4608fca106f1b84879|
2022-08-31 12:08:57 | install | Mesa-libglapi0 | 20.2.4-150300.59.3.1 | x86_64 ||Basesystem_Module_15_SP3_x86_64:SLE-Module-Basesystem15-SP3-Updates|6170c01d46ec4b79feab1a1d5381e4328ca325f9134f73b4d80b01729c32446b|
2022-08-31 12:08:57 | install | libz1-32bit | 1.2.11-150000.3.33.1 | x86_64 ||Basesystem_Module_15_SP3_x86_64:SLE-Module-Basesystem15-SP3-Updates|fd6f29c14574b6daa8c8af6a17949ac9d9d68c71b7ac143a714eaa4815fee937|
2022-08-31 12:08:57 | install | libudev1-32bit |246.16-150300.7.51.1 | x86_64 ||Basesystem_Module_15_SP3_x86_64:SLE-Module-Basesystem15-SP3-Updates|39993ba30db3639e359662c4a70333b5f54718622309984e0c6e9a43bd08be00|
2022-08-31 12:08:57 | install | libsystemd0-32bit |246.16-150300.7.51.1 | x86_64 ||Basesystem_Module_15_SP3_x86_64:SLE-Module-Basesystem15-SP3-Updates|19aef524977d87bf6c4ba27e810c6e0ad849d68389cdbda5469a778895d01095|
2022-08-31 12:08:57 | install | libpcre1-32bit |8.45-150000.20.13.1 | x86_64 ||Basesystem_Module_15_SP3_x86_64:SLE-Module-Basesystem15-SP3-Updates|75a6cf6909f11a956935c6612cbac7509f33e7dca1dee6165c2698122a0be1ca|
...
</div>
<br />
Usando grep, podemos filtrar los resultados por año:
<br />
<br />
<div class="terminal">HOST # cat /var/log/zypp/history | grep 2022 | grep -E 'patch|install'
</div>
<br />
<br />
<h2>Listado</h2>
<br />
Por otro lado, podemos ver una lista con todos los parches instalados usando el siguiente comando:
<br />
<br />
<div class="terminal">HOST # zypper search --type patch --installed-only
Loading repository data...
Reading installed packages...
S | Name | Summary | Type
--+---------------------------------------------+-----------------------------+------
i | SUSE-SLE-Module-Basesystem-15-SP3-2021-1474 | Security update for ceph | patch
i | SUSE-SLE-Module-Basesystem-15-SP3-2021-1481 | Recommended update for lvm2 | patch
i | SUSE-SLE-Module-Basesystem-15-SP3-2021-1491 | Security update for p7zip | patch
i | SUSE-SLE-Module-Basesystem-15-SP3-2021-1493 | Security update for avahi | patch
i | SUSE-SLE-Module-Basesystem-15-SP3-2021-1523 | Security update for libxml2 | patch
...
</div>
<br />
Si queremos listar los parches por el CVE al que hacen referencia:
<br />
<br />
<div class="terminal">HOST # zypper list-patches --cve
The following matches in issue numbers have been found:
Issue | No. | Patch | Category | Severity | Status
------+---------------+-------------------+-------------+-----------+----------
cve | CVE-2015-0287 | SUSE-SLE-Module.. | recommended | moderate | needed
cve | CVE-2014-3566 | SUSE-SLE-SERVER.. | recommended | moderate | not needed
...
</div>
<br />
<br />
Fuentes:
<br />
<br />
<a href="https://documentation.suse.com/sles/15-SP3/pdf/book-sle-admin_color_en.pdf" target="_blank">https://documentation.suse.com/sles/15-SP3/pdf/book-sle-admin_color_en.pdf</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-83809333408140256172022-08-24T09:16:00.057+02:002022-08-30T11:42:29.168+02:00Esconder la cabecera Server en nginx<img border="0" data-original-height="200" data-original-width="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4JF7SgytM81BbNniaOKyDwZMf2PlLMyC5VgexA3cWkGgQw8btV9L85UO0iUo-4r-ni8LDVs0e3yVDoNw2Jo4tXm4as0uUpyWt3M4LjnE-HZXFeOVD-PkGD1LlmI6gxzdHQf16OfrmimM/s1600/nginx.png" style="display: none;" /><span class="subtitulo">Cómo esconder la versión de nginx o la cabecera server por completo.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh47tZ_GPJH5zmvfORkTBv_LDL4QmadQIRO2h7BTVc_UdCydf2L4Sdqcr_LHySKJ_20s5OuHBJ3Yj0Df-3JtYd4_YlZMbXvD_HhcJR5vSssbWoYOG07PMD12KWXLGjpXvKXaRx31Wh2PBc/s1600/nginx.png"><img border="0" class="center" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh47tZ_GPJH5zmvfORkTBv_LDL4QmadQIRO2h7BTVc_UdCydf2L4Sdqcr_LHySKJ_20s5OuHBJ3Yj0Df-3JtYd4_YlZMbXvD_HhcJR5vSssbWoYOG07PMD12KWXLGjpXvKXaRx31Wh2PBc/s1600/nginx.png" width="100%" /></a>
<br />
<br />
Tras una auditoría de seguridad se me ha pedido esconder la versión de nginx corriendo en un servidor.
<br />
<br />
nginx, tanto en su versión plus como en su versión open source, permite esconder la versión que corre un servidor mediante la directiva server_tokens. Eso es útil para esconder la versión de nginx que se muestra en las páginas de error y en la cabecera Server de cada respuesta.
<br />
<br />
Las distintas posibilidades de sintaxis son las siguientes:
<br />
<br />
- server_tokens on: muestra la versión de nginx.<br />
- server_tokens off: no muestra la versión de nginx.<br />
- server_tokens build: muestra el nombre del build junto a la versión.<br />
- server_tokens "string": muestra un string personalizado (plus).<br />
- server_tokens "": no muestra la cabecera server (plus).
<br />
<br />
Por defecto nginx usa "server_tokens on", es decir, muestra la versión instalada de nginx.
<br />
<br />
Si quisieramos esconder la versión, como se me pedía a mi, podríamos usar:
<br />
<br />
<div class="terminal">server_tokens off;
</div>
<br />
Esta directiva se puede usar en distintos contextos:
<br />
<br />
- http: todos los dominios.<br />
- server: un dominio concreto.<br />
- location: una ruta dentro de un dominio concreto.
<br />
<br />
Asimismo, las dos últimas posibilidades (string personalizado y esconder el nombre del software) sólo están disponibles en nginx plus (la subscripción comercial) desde la versión 1.9.13.
<br />
<br />
Si queremos obtener los mismos resultados con la versión open source, siempre podemos compilar el código fuente de nginx eliminando todas las referencias a la versión o a nginx en sí mismo.
<br />
<br />
<br />
Fuentes:
<br />
<br />
<a href="http://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens" target="_blank">http://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-30509666044526830622022-08-03T12:53:00.064+02:002022-08-30T15:17:30.098+02:00Compartir directorios entre servidores vía NFS<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS5AkLcliThYRe7U_nDvRswdXnF3mSAJ31NaX0_rOf1muicbNUjrzvlJ0oXqkmdOuYHsoW5h1JjS3Oos8_NqTrxmNBrqKV5vFOukL0ZAzL77ZOdwm_q0kahrNedSOLwkSrO47RoaEiBmE/s1600/linux.png" style="display: none">
<span class="subtitulo">Cómo compartir directorios vía NFS entre servidores Linux.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpHSGCLfrBuKCCaT52rEboITzt4FMWX7nirSttpHr7dVwtc-EXcJhkCABOdStEkE5qr4xhMogOnNtIREes2p4Ir_6VonWhtggDeEGaA9FjiMbZxu4OoKpH1fL5lRRk-sMnbu3GYoeh4Vo/s1600/linux.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpHSGCLfrBuKCCaT52rEboITzt4FMWX7nirSttpHr7dVwtc-EXcJhkCABOdStEkE5qr4xhMogOnNtIREes2p4Ir_6VonWhtggDeEGaA9FjiMbZxu4OoKpH1fL5lRRk-sMnbu3GYoeh4Vo/s1600/linux.png" width="100%" class="center" /></a>
<br />
<br />
A continuación un pequeño manual de cómo compartir directorios entre sistemas Linux vía NFS.
<br />
<br />
<br />
<h2>Servidor</h2>
<br />
En el lado servidor, instalamos el paquete nfs-server:
<br />
<br />
<div class="terminal">HOST # zypper in nfs-server*
</div>
<br />
Añadimos la entrada del host que se conectará a este servidor en la lista de entradas permitidas:
<br />
<br />
<div class="terminal">HOST # cat /etc/exports
# See the exports(5) manpage for a description of the syntax of this file.
# This file contains a list of all directories that are to be exported to
# other computers via NFS (Network File System).
# This file used by rpc.nfsd and rpc.mountd. See their manpages for details
# on how make changes in this file effective.
/carpetaexportada/ 10.100.200.2(rw,sync,no_root_squash)
</div>
<br />
Arrancamos el servicio nfs-server:
<br />
<br />
<div class="terminal">HOST # service nfs-server start
</div>
<br />
Lo hacemos permanente:
<br />
<br />
<div class="terminal">HOST # systemctl enable nfs-server
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
</div>
<br />
Exportamos el share:
<br />
<br />
<div class="terminal">HOST # exportsfs -a
</div>
<br />
<br />
<h2>Cliente</h2>
<br />
En el cliente, montamos el share en /etc/fstab:
<br />
<br />
<div class="terminal">10.120.200.1:/carpetaexportada /montajelocal nfs defaults 0 0
</div>
<br />
Remontamos todo:
<br />
<br />
<div class="terminal">HOST # mount -a
</div>
<br />
Mostramos las carpetas remotas compartidas:
<br />
<br />
<div class="terminal">HOST # showmount -e 10.100.200.1
Export list for 10.100.200.2:
/carpetaexportada 10.100.200.1
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-78939236717795583882022-07-06T18:02:00.031+02:002022-08-31T14:17:29.245+02:00Nginx socket() failed (24: Too many open files)<img border="0" data-original-height="200" data-original-width="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4JF7SgytM81BbNniaOKyDwZMf2PlLMyC5VgexA3cWkGgQw8btV9L85UO0iUo-4r-ni8LDVs0e3yVDoNw2Jo4tXm4as0uUpyWt3M4LjnE-HZXFeOVD-PkGD1LlmI6gxzdHQf16OfrmimM/s1600/nginx.png" style="display: none;" /><span class="subtitulo">Cómo solucionar el error "too many open files" en NGINX.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh47tZ_GPJH5zmvfORkTBv_LDL4QmadQIRO2h7BTVc_UdCydf2L4Sdqcr_LHySKJ_20s5OuHBJ3Yj0Df-3JtYd4_YlZMbXvD_HhcJR5vSssbWoYOG07PMD12KWXLGjpXvKXaRx31Wh2PBc/s1600/nginx.png"><img border="0" class="center" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh47tZ_GPJH5zmvfORkTBv_LDL4QmadQIRO2h7BTVc_UdCydf2L4Sdqcr_LHySKJ_20s5OuHBJ3Yj0Df-3JtYd4_YlZMbXvD_HhcJR5vSssbWoYOG07PMD12KWXLGjpXvKXaRx31Wh2PBc/s1600/nginx.png" width="100%" /></a>
<br />
<br />
Al acceder a una web que pasaba a través de NGINX en modo reverse proxy, he visto que esta no era accesible y me he encontrado el siguiente log en su archivo de log:
<br />
<br />
<div class="terminal">2021/07/06 12:21:23 [alert] 28720#0: *59757 socket() failed (24: Too many open files) while connecting to upstream,
</div>
<br />
Esto ha ocurrido porque NGINX tenía demasiados archivos abiertos. Recordemos que, por defecto, NGINX puede abrir un máximo de 4096 archivos simultáneos por worker.
<br />
<br />
Para saltarnos esta limitaxción, deberemos usar el parámetro "worker_rlimit_nofile", el cual deberemos añadir al archivo /etc/nginx/nginx.conf antes del bloque http:
<br />
<br />
<div class="terminal"># Increase open files
worker_rlimit_nofile 30000;
</div>
<br />
En el ejemplo anterior le estamos diciendo a NGINX que puede abrir un máximo de 30.000 archivos, lo cual debería ser suficiente para proxys con una cantidad elevada de peticiones por segundo.
<br />
<br />
Para aplicar los cambios, reiniciamos NGINX:
<br />
<br />
<div class="terminal">service nginx restart
</div>
<br />
Luego comprobamos que la config. se ha aplicado correctamente:
<br />
<br />
<div class="terminal">HOST # ps -ef | grep nginx
root 5092 1 0 09:33 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 5093 5092 13 09:33 ? 00:37:06 nginx: worker process
</div>
<br />
Nos fijamos en el worker process, servicio con PID 5093 y miramos sus límites:
<br />
<br />
<div class="terminal">HOST # cat /proc/5093/limits | grep "open files"
Max open files 30000 30000 files
</div>
<br />
<br />
Fuentes:
<br />
<br />
<a href="https://www.claudiokuenzler.com/blog/850/nginx-socket-failed-24-too-many-open-files" target="_blank">https://www.claudiokuenzler.com/blog/850/nginx-socket-failed-24-too-many-open-files</a>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-52509574899619140052022-06-01T22:10:00.056+02:002022-08-31T13:44:02.651+02:00NGINX: página de error 403 personalizada<img border="0" data-original-height="200" data-original-width="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4JF7SgytM81BbNniaOKyDwZMf2PlLMyC5VgexA3cWkGgQw8btV9L85UO0iUo-4r-ni8LDVs0e3yVDoNw2Jo4tXm4as0uUpyWt3M4LjnE-HZXFeOVD-PkGD1LlmI6gxzdHQf16OfrmimM/s1600/nginx.png" style="display: none;" /><span class="subtitulo">Cómo personalizar la página de error 403 Forbidden en NGINX.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh47tZ_GPJH5zmvfORkTBv_LDL4QmadQIRO2h7BTVc_UdCydf2L4Sdqcr_LHySKJ_20s5OuHBJ3Yj0Df-3JtYd4_YlZMbXvD_HhcJR5vSssbWoYOG07PMD12KWXLGjpXvKXaRx31Wh2PBc/s1600/nginx.png"><img border="0" class="center" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh47tZ_GPJH5zmvfORkTBv_LDL4QmadQIRO2h7BTVc_UdCydf2L4Sdqcr_LHySKJ_20s5OuHBJ3Yj0Df-3JtYd4_YlZMbXvD_HhcJR5vSssbWoYOG07PMD12KWXLGjpXvKXaRx31Wh2PBc/s1600/nginx.png" width="100%" /></a>
<br />
<br />
Por defecto, NGINX muestra una página de error 403 Forbidden muy básica. Lo bueno es que podemos personalizarla a nuestro gusto creando un documento HTML y enlazándolo desde la config. de NGINX.
<br />
<br />
Primero creamos un documento HTML:
<br />
<br />
<div class="terminal"><html>
<head><title>Error 403 – Acceso denegado</title></head>
<body>
No tienes permisos suficientes para acceder a esta página.
</body>
</html>
</div>
<br />
Cuando hayamos creado el documento, lo guardamos en la ruta "root" de la web:
<br />
<br />
A continuación, editamos el fichero /etc/nginx/nginx.conf y añadimos:
<br />
<br />
<div class="terminal">...
server {
...
error_page 403 /error403.html;
location /error403.html {
allow all;
}
...
}
...
</div>
<br />
Destacar que la config. que nos permite personalizar el error 403 debe estar dentro del bloque "server" para un dominio o subdominio concreto.
<br />
<br />
En el código anterior se le dice a NGINX que muestre el archivo error403.html cada vez que ocurra un error 403 en el acceso a la web. Adicionalmente, se debe especificar explícitamente que todo el mundo pueda leer este archivo, de lo contrario, se mostrará la página de error 403 predeterminada de NGINX y nuestro trabajo no habrá servido para nada.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-6570397585046217422022-05-04T10:47:00.003+02:002022-05-09T11:05:48.793+02:00Exportar lista de usuarios de un grupo de AD<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiW72We9C7c9NwF7viPMrTQ6aGqr8TrxBlG_RwEgwWpA-iu5mL94ejiKUf9fK3jMzmhTz3lCuTWSKjJN3ciJuHFgrS3RLK3bAqfydNdKmbQkH0Yov0u1u9FEksRTyNPEN_5f0b29lnqy8Y/s1600/powershell.png" data-original-width="200" data-original-height="200" style="display:none" />
<span class="subtitulo">Cómo exportar todos los usuarios de un grupo de Active Directory.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipMjruKb3xXz__0YqD4oT1GYwcm5Bbbi9D58IpJkKWIJo97b8voXxHD_eD_uyz0UDfnbYTBflfRKDFgr1Hnny284q5vfk5bxZjjipXj7jINijlvBSf2rhaJvHf3KiNmRcuLwJJ7SN_yb4/s1600/powershell.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipMjruKb3xXz__0YqD4oT1GYwcm5Bbbi9D58IpJkKWIJo97b8voXxHD_eD_uyz0UDfnbYTBflfRKDFgr1Hnny284q5vfk5bxZjjipXj7jINijlvBSf2rhaJvHf3KiNmRcuLwJJ7SN_yb4/s1600/powershell.png" width="100%" /></a>
<br />
<br />
Imaginemos que queremos enviar un correo a todos los usuarios de un grupo concreto de Active Directory. Primero, deberemos saber qué usuarios hay en el grupo.
<br />
<br />
Para ver los usuarios y sus direcciones de correo, deberemos exportar los campos nombre y mail de los usuarios. Para ello, podemos usar la función Get-AdGroupMember:
<br />
<br />
<!-- HTML generated using hilite.me --><div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #19177C">$GroupName</span> = <span style="color: #BA2121">'Nombre del grupo'</span>
<span style="color: #008000">Get-AdGroupMember</span> -Identity <span style="color: #19177C">$GroupName</span> | <span style="color: #008000">Get-AdUser</span> -Properties * | Select Name,Mail
</pre></div>
<br />
El output del script será:
<br />
<br />
<div class="powershell">Name Mail
-------------- -----------------
Marc Garcia marc.garcia@una.org
Alberto Perez alberto.perez@una.org
...
</div>
<br />
De esta forma veremos el output en la terminal.
<br />
<br />
Si queremos exportar el resultado a un archivo csv podemos usar la función Export-csv:
<br />
<br />
<!-- HTML generated using hilite.me --><div style="background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #19177C">$GroupName</span> = <span style="color: #BA2121">'Nombre del grupo'</span>
<span style="color: #19177C">$ExportPath</span> = <span style="color: #BA2121">'C:\Temp\export.csv'</span>
<span style="color: #008000">Get-AdGroupMember</span> -Identity <span style="color: #19177C">$GroupName</span> | <span style="color: #008000">Get-AdUser</span> -Properties * | Select Name,Mail | <span style="color: #008000">Export-csv</span> -NoTypeInformation <span style="color: #19177C">$ExportPath</span>
</pre></div>
<br />
En este caso, el resultado será un archivo csv con los campos separados por comas:
<br />
<br />
<div class="terminal">"Marc García","marc.garcia@una.org"
"Alberto Perez","alberto.perez@una.org"
...
</div>
<br />
Una vez obtenido el archivo csv, ya lo podremos manipular con Excel para extraer solo las direcciones de correo o eliminar ciertos usuarios, entre otros.
<br />
<br />
<br />
Fuentes:
<br />
<br />
<a href="https://shellgeek.com/powershell-export-active-directory-group-members/">https://shellgeek.com/powershell-export-active-directory-group-members/</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-17536391954723145392022-04-06T18:27:00.017+02:002022-04-07T18:31:53.153+02:00Extraer .crt de un fichero .pfx<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO2M0VKf7cP5v-a0GuUP7az8_bxQI36OK9atdcKhj1aVJJUAFP0vFaOgvuRj8hlitNphp6n47AuPuY0OwvCWoKxJcqKAbDa0BTfGQEnTtmWhr384jCpMopmKHkqECPcGszSF-MIEOU8BE/s1600/cert.png" style="display: none">
<span class="subtitulo">Comprobar si un certificado en formato PFX tiene un password asociado.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpHSGCLfrBuKCCaT52rEboITzt4FMWX7nirSttpHr7dVwtc-EXcJhkCABOdStEkE5qr4xhMogOnNtIREes2p4Ir_6VonWhtggDeEGaA9FjiMbZxu4OoKpH1fL5lRRk-sMnbu3GYoeh4Vo/s1600/linux.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpHSGCLfrBuKCCaT52rEboITzt4FMWX7nirSttpHr7dVwtc-EXcJhkCABOdStEkE5qr4xhMogOnNtIREes2p4Ir_6VonWhtggDeEGaA9FjiMbZxu4OoKpH1fL5lRRk-sMnbu3GYoeh4Vo/s1600/linux.png" width="100%" class="center" /></a>
<br />
<br />
Si alguien nos envía un fichero .pfx que contiene un certificado generado para ser usado en un servidor Windows, necesitamos extraer la parte pública del certificado (el fichero .crt).
<br />
<br />
<br />
<h2>Exportar certificado (IIS)</h2>
<br />
Abrimos el Microsoft Management Console (mmc).
<br />
<br />
Ir a File > Add/Remove Snap-in.
<br />
<br />
Doble clic en Certificates.
<br />
<br />
Seleccionar Computer account.
<br />
<br />
Seleccionar Local computer y clic en Finish.
<br />
<br />
Ir a Console Root > Certificates > Certificate Enrollment Requests.
<br />
<br />
Clic derecho en el certificado y seleccionar All Tasks > Export.
<br />
<br />
Selecciona Yes, export the private key.
<br />
<br />
Selecciona Personal Information Exchange – PKCS #12.
<br />
<br />
Entra un password para proteger tu private key (obligatorio).
<br />
<br />
Seleccionar la ubicación dodne guardar la private key.
<br />
<br />
Clica Finish.
<br />
<br />
La clave privada se exporta como archivo .pfx.
<br />
<br />
<br />
<h2>Extraer .crt del .pfx</h2>
<br />
Ahora toca extraer el .crt del .pfx. Para ello, podemos usar la utilidad openssl en Windows/Linux:
<br />
<br />
<div class="terminal">HOST# openssl pkcs12 -in archivo.pfx -clcerts -nokeys -out archivo.crt
</div>
<br />
Donde archivo.pfx es el origen y archivo.crt el fichero que se generará.
<br />
<br />
Ya podemos usar el fichero .crt en nuestro servidor Linux.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-34679242751149984252022-03-16T18:25:00.001+01:002022-03-17T18:36:49.050+01:00nginx: [emerg] getgrnam("deploy") failed<img border="0" data-original-height="200" data-original-width="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4JF7SgytM81BbNniaOKyDwZMf2PlLMyC5VgexA3cWkGgQw8btV9L85UO0iUo-4r-ni8LDVs0e3yVDoNw2Jo4tXm4as0uUpyWt3M4LjnE-HZXFeOVD-PkGD1LlmI6gxzdHQf16OfrmimM/s1600/nginx.png" style="display: none;" /><span class="subtitulo">Cómo cambiar el usuario desde el que se ejecuta NGINX.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh47tZ_GPJH5zmvfORkTBv_LDL4QmadQIRO2h7BTVc_UdCydf2L4Sdqcr_LHySKJ_20s5OuHBJ3Yj0Df-3JtYd4_YlZMbXvD_HhcJR5vSssbWoYOG07PMD12KWXLGjpXvKXaRx31Wh2PBc/s1600/nginx.png"><img border="0" class="center" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh47tZ_GPJH5zmvfORkTBv_LDL4QmadQIRO2h7BTVc_UdCydf2L4Sdqcr_LHySKJ_20s5OuHBJ3Yj0Df-3JtYd4_YlZMbXvD_HhcJR5vSssbWoYOG07PMD12KWXLGjpXvKXaRx31Wh2PBc/s1600/nginx.png" width="100%" /></a>
<br />
<br />
Hoy me han pedido que cambie el usuario desde el que se ejecuta nginx de "nginx" a "deploy", y me he encontrado algún problema durante el proceso.
<br />
<br />
Primero he comentado la línea:
<br />
<br />
<div class="terminal">user nginx;
</div>
<br />
y he añadido la línea:
<br />
<br />
<div class="terminal">user deploy;
</div>
<br />
dentro de /etc/nginx/nginx.conf.
<br />
<br />
A continuación, he comprobado la validez del fichero de confgiuración con:
<br />
<br />
<div class="terminal">HOST:/ # nginx -t
nginx: [emerg] getgrnam("deploy") failed in /etc/nginx/nginx.conf:2
nginx: configuration file /etc/nginx/nginx.conf test failed
</div>
<br />
Tras buscar por internet he encontrado que se debe espcificar el nombre del grupo después del nombre de usuario (con un espacio en blanco entre ellos), es decir:
<br />
<br />
<div class="terminal">user usuario grupo;
</div>
<br />
Si no se especifica el grupo, NGINX toma como nombre de grupo el nombre de usuario.
<br />
<br />
Para aplicar este cambio de configuración, primero he comprobado su validez:
<br />
<br />
<div class="terminal">HOST:/ # nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
</div>
<br />
Acto seguido, he cargado la nueva configuración:
<br />
<br />
<div class="terminal">nginx -s reload
</div>
<br />
Tras este reload, nginx arrojaba un error 500 al navegar por la web, por lo que he optado por reiniciar el servicio nginx por completo:
<br />
<br />
<div class="terminal">systemctl restart nginx
</div>
<br />
Tras reiniciar el servicio, la web ha funcionado con normalidad.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-52162471367773886182022-01-26T15:35:00.053+01:002022-08-31T15:49:25.707+02:00AWS cli: recuperar versión de un fichero en S3<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizJT8ngxT7NdqnwhA9cErRwUuMva241ylyBChlugJHwgklIX1rfvccTkwOi4FKzmqXW8_4Qix95-uwK_EiEizvdZ28vMb0L7-IRPrPKz_qSvuRW8f8BuyQ43at5aas2_u094SW_fmTn8A/s1600/aws.png" data-original-width="200" data-original-height="200" style="display:none" />
<span class="subtitulo">Cómo recuperar una versión concreta de un fichero alojado en un bucket S3 de AWS.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrDFxQJyKUvj7iuRYKTEXZVYQW1hfl-LAzVu-Evrh1nIL4Lzy5_kYci7FrFz51OScojbPqMfdC74cvw28Dn_IOX5bu2VFz7zA_E5FWvfy_gvqK796k2yLzSDkRXcLhywXobgj0yGOdBOM/s1600/0.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrDFxQJyKUvj7iuRYKTEXZVYQW1hfl-LAzVu-Evrh1nIL4Lzy5_kYci7FrFz51OScojbPqMfdC74cvw28Dn_IOX5bu2VFz7zA_E5FWvfy_gvqK796k2yLzSDkRXcLhywXobgj0yGOdBOM/s1600/0.png" width="100%" class="center" /></a>
<br />
<br />
Veamos cómo recuperar una versión concreta de un fichero alojado en un bucket S3 de AWS.
<br />
<br />
En este ejemplo, el bucket se llama "blai-1".
<br />
<br />
Primero de todo, debemos tener habilitado o habilitar el versionado:
<br />
<br />
<div class="terminal">[ec2-user@ip-10-5-0-143 ~]$ aws s3api put-bucket-versioning --bucket s3-blai-1 --versioning-configuration Status=Enabled
</div>
<br />
Imaginemos que tenemos 3 ficheros en el bucket "blai-1":
<br />
<br />
<div class="terminal">[ec2-user@ip-10-5-0-143 ~]$ aws s3 ls s3://s3-blai-1/files/
2021-11-24 11:56:31 30318 file1.txt
2021-11-24 11:56:32 43784 file2.txt
2021-11-24 11:56:32 96675 file3.txt
</div>
<br />
Borramos file1.txt en local:
<br />
<br />
<div class="terminal">[ec2-user@ip-10-5-0-143 ~]$ sudo rm files/file1.txt
sudo rm files/file1.txt
</div>
<br />
Hacemos un sync de archivos con el flag delete (borra en el bucket aquello que no exista en local):
<br />
<br />
<div class="terminal">[ec2-user@ip-10-5-0-143 ~]$ aws s3 sync files s3://s3-blai-1/files/ --delete
delete: s3://s3-blai-1/files/file1.txt
</div>
<br />
Tras la instrucción anterior, listamos los ficheros presentes en el bucket:
<br />
<br />
<div class="terminal">[ec2-user@ip-10-5-0-143 ~]$ aws s3 ls s3://s3-blai-1/files/
2021-11-24 11:56:32 43784 file2.txt
2021-11-24 11:56:32 96675 file3.txt
</div>
<br />
Observamos que file1.txt ya no existe.
<br />
<br />
De repente necesitamos el file1.txt. Listamos sus versiones:
<br />
<br />
<div class="terminal">[ec2-user@ip-10-5-0-143 ~]$ aws s3api list-object-versions --bucket s3-blai-1 --prefix files/file1.txt
{
"DeleteMarkers": [
{
"Owner": {
"DisplayName": "aws038351",
"ID": "2a6f0ac58291262d92b44b112cda554a8cf030cd5d4d742a7b60af5a5b89fd86"
},
"IsLatest": true,
"VersionId": "Nd1QvuJY56xi7nFHSC2ej_3nvm7xvw1u",
"Key": "files/file1.txt",
"LastModified": "2021-11-24T11:57:35.000Z"
}
],
"Versions": [
{
"LastModified": "2021-11-24T11:56:31.000Z",
"VersionId": "M3YMFwyIciILCfa.VX3pRdlLJkheUjy1",
"ETag": "\"b76b2b775023e60be16bc332496f8409\"",
"StorageClass": "STANDARD",
"Key": "files/file1.txt",
"Owner": {
"DisplayName": "aws038351",
"ID": "2a6f0ac58291262d92b44b112cda554a8cf030cd5d4d742a7b60af5a5b89fd86"
},
"IsLatest": false,
"Size": 30318
}
]
}
</div>
<br />
Recuperamos la versión M3YMFwyIciILCfa.VX3pRdlLJkheUjy1 del fichero file1.txt, con fecha 2021-11-24T11:56:31.000Z:
<br />
<br />
<div class="terminal">[ec2-user@ip-10-5-0-143 ~]$ sudo aws s3api get-object --bucket s3-blai-1 --key files/file1.txt --version-id M3YMFwyIciILCfa.VX3pRdlLJkheUjy1 files/file1.txt
{
"AcceptRanges": "bytes",
"ContentType": "text/plain",
"LastModified": "Wed, 24 Nov 2021 11:56:31 GMT",
"ContentLength": 30318,
"VersionId": "M3YMFwyIciILCfa.VX3pRdlLJkheUjy1",
"ETag": "\"b76b2b775023e60be16bc332496f8409\"",
"Metadata": {}
}
</div>
<br />
Listamos los ficheros en local:
<br />
<br />
<div class="terminal">[ec2-user@ip-10-5-0-143 ~]$ ls -la
2022-01-26 11:56:31 30318 file1.txt
2021-11-24 11:56:32 43784 file2.txt
2021-11-24 11:56:32 96675 file3.txt
</div>
<br />
Sincornizamos los ficheros hacia el bucket:
<br />
<br />
<div class="terminal">[ec2-user@ip-10-5-0-143 ~]$ aws s3 sync files s3://s3-blai-1/files/
upload: files/file1.txt to s3://s3-blai-1/files/file1.txt
</div>
<br />
Listamos los ficheros del bucket:
<br />
<br />
<div class="terminal">[ec2-user@ip-10-5-0-143 ~]$ aws s3 ls s3://s3-blai-1/files/
2022-01-26 11:00:18 30318 file1.txt
2021-11-24 11:56:32 43784 file2.txt
2021-11-24 11:56:32 96675 file3.txt
</div>
<br />
Tras el sync, file1.txt vuelve a estar presente.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-64708619963248208312021-12-29T14:21:00.030+01:002022-08-31T14:32:27.313+02:00AWS: cambiar tipo de instancia desde cli<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizJT8ngxT7NdqnwhA9cErRwUuMva241ylyBChlugJHwgklIX1rfvccTkwOi4FKzmqXW8_4Qix95-uwK_EiEizvdZ28vMb0L7-IRPrPKz_qSvuRW8f8BuyQ43at5aas2_u094SW_fmTn8A/s1600/aws.png" data-original-width="200" data-original-height="200" style="display:none" />
<span class="subtitulo">Cómo cambiar el tipo de instancia de AWS desde cli en AWS.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrDFxQJyKUvj7iuRYKTEXZVYQW1hfl-LAzVu-Evrh1nIL4Lzy5_kYci7FrFz51OScojbPqMfdC74cvw28Dn_IOX5bu2VFz7zA_E5FWvfy_gvqK796k2yLzSDkRXcLhywXobgj0yGOdBOM/s1600/0.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrDFxQJyKUvj7iuRYKTEXZVYQW1hfl-LAzVu-Evrh1nIL4Lzy5_kYci7FrFz51OScojbPqMfdC74cvw28Dn_IOX5bu2VFz7zA_E5FWvfy_gvqK796k2yLzSDkRXcLhywXobgj0yGOdBOM/s1600/0.png" width="100%" class="center" /></a>
<br />
<br />
Veamos cómo cambiar el tipo de instancia EC2 de un servidor alojado en AWS usando AWS cli sobre un sistema operativo Linux.
<br />
<br />
Primero, definimos la variable instance con el ID de la instancia sobre la que queremos trabajar:
<br />
<br />
<div class="terminal">instance=i-0bXXXXXXXXXXXXXc1
</div>
<br />
A continuación apagamos la instancia:
<br />
<br />
<div class="terminal">aws ec2 stop-instances --instance-ids ${instance}
{
"StoppingInstances": [
{
"InstanceId": "i-0bXXXXXXXXXXXXXc1",
"CurrentState": {
"Code": 64,
"Name": "stopping"
},
"PreviousState": {
"Code": 16,
"Name": "running"
}
}
]
}
</div>
<br />
Cambiamos el tipo de instancia:
<br />
<br />
<div class="terminal">aws ec2 modify-instance-attribute --instance-id ${instance} --instance-type t3.large
</div>
<br />
Iniciamos la instancia:
<br />
<br />
<div class="terminal">aws ec2 start-instances --instance-id ${instance}
{
"StartingInstances": [
{
"PreviousState": {
"Code": 80,
"Name": "stopped"
},
"CurrentState": {
"Code": 0,
"Name": "pending"
},
"InstanceId": "i-0bXXXXXXXXXXXXXc1"
}
]
}
</div>
<br />
Una vez la instancia esté levantada, ya deberíamos ver su nuevo tipo de instancia en su ficha.
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-57314082098529315062021-12-22T13:43:00.055+01:002022-08-30T13:55:13.710+02:00Montar carpeta de Windows en el boot de Linux<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS5AkLcliThYRe7U_nDvRswdXnF3mSAJ31NaX0_rOf1muicbNUjrzvlJ0oXqkmdOuYHsoW5h1JjS3Oos8_NqTrxmNBrqKV5vFOukL0ZAzL77ZOdwm_q0kahrNedSOLwkSrO47RoaEiBmE/s1600/linux.png" style="display: none">
<span class="subtitulo">Cómo montar una carpeta compartida en red en Windows en un sistema operativo Linux.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpHSGCLfrBuKCCaT52rEboITzt4FMWX7nirSttpHr7dVwtc-EXcJhkCABOdStEkE5qr4xhMogOnNtIREes2p4Ir_6VonWhtggDeEGaA9FjiMbZxu4OoKpH1fL5lRRk-sMnbu3GYoeh4Vo/s1600/linux.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpHSGCLfrBuKCCaT52rEboITzt4FMWX7nirSttpHr7dVwtc-EXcJhkCABOdStEkE5qr4xhMogOnNtIREes2p4Ir_6VonWhtggDeEGaA9FjiMbZxu4OoKpH1fL5lRRk-sMnbu3GYoeh4Vo/s1600/linux.png" width="100%" class="center" /></a>
<br />
<br />
Si tenemos una carpeta compartida en red en Windows y queremos montarla en Linux, podemos editar el fichero /etc/fstab del sistema Linux y añadir una línea con la siguiente sintaxis:
<br />
<br />
<div class="terminal">//<Winserver>/<Share> <Mountpoint> <FileSystemType> <Options> 0 0
</div>
<br />
Por ejemplo:
<br />
<br />
<div class="terminal">//winserver/share /mnt/winshare cifs gid=users,file_mode=0664,dir_mode=0775,auto,username=john,password=johnpass 0 0
</div>
<br />
Opciones:
<br />
<br />
//winserver/share (Windows Share)<br />
winserver puede ser el FQDN o IP del servidor y /share es la ruta del share.
<br />
<br />
/mnt/winshare (Mount Point)<br />
Directorio existente en el sistema Linux local que servirá como punto de montaje de la carpeta de Windows.
<br />
<br />
cifs (File System Type)<br />
Filesystem compatible con Windows.
<br />
<br />
gid=users<br />
Todos los ficheros y directorios en el sistema remoto serán asignados al grupo "users".
<br />
<br />
file_mode=0664<br />
Todos los ficheros existentes en el sistema remoto tendrán permisos rw-rw-r--.
<br />
<br />
dir_mode=0775<br />
Todos los directorios existentes en el sistema reoto tendrán permisos rwxrwxr-x.
<br />
<br />
auto<br />
Montar automáticamente en el boot.
<br />
<br />
username=john<br />
Usuario existente en el sistema Windows con el que acceder al recurso: john
<br />
<br />
password=johnpass<br />
Password del usuario especificado anteriormente: johnpass.
<br />
<br />
0<br />
Indica que este filesystem no debería ser dumpeado.
<br />
<br />
0<br />
Indica que este filesystem no debería ser comprobado por fsck.
<br />
<br />
<br />
Fuentes:
<br />
<br />
<a href="https://www.suse.com/support/kb/doc/?id=7000932" target="_blank">https://www.suse.com/support/kb/doc/?id=7000932 </a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-84703221793131057302021-12-15T23:58:00.015+01:002022-08-30T15:25:41.346+02:00Exportar lista de máquinas virtuales de VMWare<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTK-0CiBenXqNwcPhGNhGhvnnmSnwCmet0WYDQl4fLvH_aqf7QZKmqjD67xP53FY4sWXyL3kvZDiq88ggAmG0jwGr3pATbdQCuY353RnOcTdaaoodib6t8nEHk4ZCmggjYLU1KJ3Hv84U/s1600/vmware.png" data-original-width="200" data-original-height="200" style="display: none">
<span class="subtitulo">Exportar lista de máquinas virtuales de un entorno VMWare con vSphere.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFp6poeDBYJeWIQfKTay122D2PQLMl5oEbt2b4sSVbTxvfq8D5CF9UNd8-QxTy_GZ-MI8xFsAlVnQ0PHCtjZuyXqrrMmkI0lWFTT0upAeoj7n4JfIrYP4E7STQvpBEQlha_HFqvknGAGA/s1600/0.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFp6poeDBYJeWIQfKTay122D2PQLMl5oEbt2b4sSVbTxvfq8D5CF9UNd8-QxTy_GZ-MI8xFsAlVnQ0PHCtjZuyXqrrMmkI0lWFTT0upAeoj7n4JfIrYP4E7STQvpBEQlha_HFqvknGAGA/s1600/0.png" width="100%" class="center" /></a>
<br />
<br />
Si necesitamos exportar un listado con todas las máquinas virtuales presentes en un entorno VMWare, podemos seguir este sencillo procedimiento desde el vSphere:
<br />
<br />
En vSphere Client, pulsar Menu y seleccionar Global Inventory Lists.
<br />
<br />
A la izquierda, seleccionar Hosts para ver hosts en vSphere inventory.
<br />
<br />
Seleccionar todos los hosts.
<br />
<br />
Clicar sobre el botón export.
<br />
<br />
Una vez generado el fichero CSV, ya se podrá descargar para su consulta y/o manipulación.
<br />
<br />
<br />
Fuentes:
<br />
<br />
<a href="https://docs.vmware.com/en/VMware-vSphere/7.0/com.vmware.vsphere.vcenterhost.doc/GUID-C0E8DD52-677E-464F-A3EA-044EE20B7B92.html" target="_blank">https://docs.vmware.com/en/VMware-vSphere/7.0/com.vmware.vsphere.vcenterhost.doc...</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-16456126054185064102021-12-08T18:44:00.041+01:002022-08-30T14:08:56.176+02:00nginx y http2<img border="0" data-original-height="200" data-original-width="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4JF7SgytM81BbNniaOKyDwZMf2PlLMyC5VgexA3cWkGgQw8btV9L85UO0iUo-4r-ni8LDVs0e3yVDoNw2Jo4tXm4as0uUpyWt3M4LjnE-HZXFeOVD-PkGD1LlmI6gxzdHQf16OfrmimM/s1600/nginx.png" style="display: none;" /><span class="subtitulo">Permitir peticiones HTTP/2 en nginx.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh47tZ_GPJH5zmvfORkTBv_LDL4QmadQIRO2h7BTVc_UdCydf2L4Sdqcr_LHySKJ_20s5OuHBJ3Yj0Df-3JtYd4_YlZMbXvD_HhcJR5vSssbWoYOG07PMD12KWXLGjpXvKXaRx31Wh2PBc/s1600/nginx.png"><img border="0" class="center" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh47tZ_GPJH5zmvfORkTBv_LDL4QmadQIRO2h7BTVc_UdCydf2L4Sdqcr_LHySKJ_20s5OuHBJ3Yj0Df-3JtYd4_YlZMbXvD_HhcJR5vSssbWoYOG07PMD12KWXLGjpXvKXaRx31Wh2PBc/s1600/nginx.png" width="100%" /></a>
<br />
<br />
HTTP/2 es una actualización del protocolo HTTP que mejora la velocidad y la seguridad de las interacciones cliente-servidor en Internet. HTTP/2 agrega varias funciones nuevas al tiempo que mantiene la compatibilidad con versiones anteriores, por lo que los navegadores y servidores sin compatibilidad con HTTP/2 continúan funcionando correctamente, mientras que aquellos que las posean pueden aprovechar las mejoras de rendimiento.
<br />
<br />
El enfoque principal de las mejoras de HTTP/2 es la velocidad. Una limitación importante de HTTP/1 es que solo permite solicitar un recurso por petición, por lo que para minimizar los tiempos de carga, los navegadores abren múltiples conexiones HTTP/1 a un sitio a la vez para solicitar varios recursos en paralelo, con una sobrecarga significativa. HTTP/2, por su lado, usa conexiones multiplexadas para transmitir múltiples recursos a través de una sola conexión, reduciendo la carga.
<br />
<br />
HTTP/2 también hace un uso extensivo de la compresión, lo que mejora el rendimiento al ahorrar ancho de banda. En HTTP/2, los encabezados se envían como binarios comprimidos en lugar de como texto sin formato legible por humanos. El considerable ahorro de ancho de banda compensó el aumento menor en la carga de la CPU (para comprimir y descomprimir los encabezados) y la incomodidad para los usuarios humanos que no pueden leer los encabezados (por ejemplo, con fines de depuración).
<br />
<br />
HTTP/2 también introduce la priorización de recursos. Los navegadores web y otros clientes ahora pueden indicar el orden en el que desean recibir los recursos. Los navegadores con una buena compatibilidad con HTTP/2 pueden generar páginas significativamente más rápido al priorizar los recursos que el usuario necesita ver primero. Las primeras pruebas del rendimiento de HTTP/2 han demostrado que algunas páginas se cargan casi el doble de rápido.
<br />
<br />
Para permitir peticiones HTTP/2 en nginx para dominio.com debemos añadir "http2" en "listen":
<br />
<br />
<div class="terminal">server {
listen 443 ssl http2;
server_name dominio.com
ssl_certificate server.crt;
ssl_certificate_key server.key;
}
</div>
<br />
Recargamos la configuración de nginx y este ya empezará a servir material vía HTTP/2.
<br />
<br />
<br />
Fuentes:
<br />
<br />
<a href="https://www.nginx.com/resources/glossary/http2/" target="_blank">https://www.nginx.com/resources/glossary/http2/</a>
<br />
<a href="http://nginx.org/en/docs/http/ngx_http_v2_module.html" target="_blank">http://nginx.org/en/docs/http/ngx_http_v2_module.html</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-49184144099937740372021-12-01T20:15:00.031+01:002022-08-30T13:42:26.214+02:00Montar carpeta compartida de Windows en Linux<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS5AkLcliThYRe7U_nDvRswdXnF3mSAJ31NaX0_rOf1muicbNUjrzvlJ0oXqkmdOuYHsoW5h1JjS3Oos8_NqTrxmNBrqKV5vFOukL0ZAzL77ZOdwm_q0kahrNedSOLwkSrO47RoaEiBmE/s1600/linux.png" style="display: none">
<span class="subtitulo">Cómo montar una carpeta compartida en red en Windows en un sistema operativo Linux.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpHSGCLfrBuKCCaT52rEboITzt4FMWX7nirSttpHr7dVwtc-EXcJhkCABOdStEkE5qr4xhMogOnNtIREes2p4Ir_6VonWhtggDeEGaA9FjiMbZxu4OoKpH1fL5lRRk-sMnbu3GYoeh4Vo/s1600/linux.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpHSGCLfrBuKCCaT52rEboITzt4FMWX7nirSttpHr7dVwtc-EXcJhkCABOdStEkE5qr4xhMogOnNtIREes2p4Ir_6VonWhtggDeEGaA9FjiMbZxu4OoKpH1fL5lRRk-sMnbu3GYoeh4Vo/s1600/linux.png" width="100%" class="center" /></a>
<br />
<br />
Si tenemos una carpeta compartida en red en Windows y queremos acceder a ella desde un sistema Linux, podemos montarla de la siguiente manera:
<br />
<br />
<div class="terminal">mount -t cifs -o username=<WindowsUserID>,password=<UserPassword> //<WinServer>/<Share> /<Mountpoint>
</div>
<br />
Por ejemplo:
<br />
<br />
<div class="terminal">mount -t cifs -o username=usuario,password=contrasena //winserver/share /mnt/winshare
</div>
<br />
Si no se incluye password en la orden, se preguntará a continuación.
<br />
<br />
Una vez montada la carpeta, podemos dirigirnos a /mnt/winshare para acceder al contenido.
<br />
<br />
<br />
Fuentes:
<br />
<br />
<a href="https://www.suse.com/support/kb/doc/?id=7000932" target="_blank">https://www.suse.com/support/kb/doc/?id=7000932 </a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-87669555348256108102021-11-24T15:26:00.028+01:002022-08-31T15:50:22.018+02:00AWS cli: descargar archivos de S3<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizJT8ngxT7NdqnwhA9cErRwUuMva241ylyBChlugJHwgklIX1rfvccTkwOi4FKzmqXW8_4Qix95-uwK_EiEizvdZ28vMb0L7-IRPrPKz_qSvuRW8f8BuyQ43at5aas2_u094SW_fmTn8A/s1600/aws.png" data-original-width="200" data-original-height="200" style="display:none" />
<span class="subtitulo">Cómo descargar archivos de un bucket S3 mediante el cli de AWS en Linux.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrDFxQJyKUvj7iuRYKTEXZVYQW1hfl-LAzVu-Evrh1nIL4Lzy5_kYci7FrFz51OScojbPqMfdC74cvw28Dn_IOX5bu2VFz7zA_E5FWvfy_gvqK796k2yLzSDkRXcLhywXobgj0yGOdBOM/s1600/0.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrDFxQJyKUvj7iuRYKTEXZVYQW1hfl-LAzVu-Evrh1nIL4Lzy5_kYci7FrFz51OScojbPqMfdC74cvw28Dn_IOX5bu2VFz7zA_E5FWvfy_gvqK796k2yLzSDkRXcLhywXobgj0yGOdBOM/s1600/0.png" width="100%" class="center" /></a>
<br />
<br />
Veamos cómo descargar ficheros de un bucket S3 de AWS.
<br />
<br />
En este ejemplo, el bucket se llama "blai-1".
<br />
<br />
Imaginemos que tenemos 2 archivos en local:
<br />
<br />
<div class="terminal">[ec2-user@ip-10-5-0-143 ~]$ ls
2021-11-24 11:52:21 30318 file1.txt
2021-11-24 11:52:22 43784 file2.txt
</div>
<br />
Por otro lado, tenemos 3 ficheros en el bucket S3 "blai-1":
<br />
<br />
<div class="terminal">[ec2-user@ip-10-5-0-143 ~]$ aws s3 ls s3://s3-blai-1/files/
2021-11-24 11:52:51 30318 file1.txt
2021-11-24 11:52:52 43784 file2.txt
2021-11-24 11:52:52 96675 file3.txt
</div>
<br />
Queremos descargar el archivo file3.txt. Para descargar un fichero, usamos get-object:
<br />
<br />
<div class="terminal">[ec2-user@ip-10-5-0-143 ~]$ sudo aws s3api get-object --bucket s3-blai-1 --key files/file3.txt files/file3.txt
</div>
<br />
Tras descargar el fichero, listamos en local:
<br />
<br />
<div class="terminal">[ec2-user@ip-10-5-0-143 ~]$ ls
2021-11-24 11:52:21 30318 file1.txt
2021-11-24 11:52:22 43784 file2.txt
2021-11-24 11:52:52 96675 file3.txt
</div>
<br />
Ya tenemos file3.txt en local.
<br />
<br />
El último parámetro de la instrucción es la ruta y nombre de archivo que tendrá en local el archivo que descargamos - seleccionándolo con --key - lo cual puede ser modificado según nuestras necesidades.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-13752518696414971212021-11-17T10:56:00.000+01:002022-08-31T15:25:17.048+02:00Ver fecha de caducidad de un certificado .pfx<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO2M0VKf7cP5v-a0GuUP7az8_bxQI36OK9atdcKhj1aVJJUAFP0vFaOgvuRj8hlitNphp6n47AuPuY0OwvCWoKxJcqKAbDa0BTfGQEnTtmWhr384jCpMopmKHkqECPcGszSF-MIEOU8BE/s1600/cert.png" style="display: none">
<span class="subtitulo">Comprobar fecha de expiración de un certificado en formato .pfx.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpHSGCLfrBuKCCaT52rEboITzt4FMWX7nirSttpHr7dVwtc-EXcJhkCABOdStEkE5qr4xhMogOnNtIREes2p4Ir_6VonWhtggDeEGaA9FjiMbZxu4OoKpH1fL5lRRk-sMnbu3GYoeh4Vo/s1600/linux.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpHSGCLfrBuKCCaT52rEboITzt4FMWX7nirSttpHr7dVwtc-EXcJhkCABOdStEkE5qr4xhMogOnNtIREes2p4Ir_6VonWhtggDeEGaA9FjiMbZxu4OoKpH1fL5lRRk-sMnbu3GYoeh4Vo/s1600/linux.png" width="100%" class="center" /></a>
<br />
<br />
Para ver la fecha de expiración de un certificado en formato .pfx que hayamos exportado de un servidor Windows, podemos usar la utilidad openssl en Windows/Linux:
<br />
<br />
<div class="terminal">HOST# openssl pkcs12 -in archivo.pfx -nokeys | openssl x509 -noout -enddate
</div>
<br />
Donde archivo.pfx es el nombre del certificado en formato pfx.
<br />
<br />
Para incluir el password del certificado en la línea de comandos, podemos incluir:
<br />
<br />
-passin pass:"${pass}"
<br />
<br />
<div class="terminal">HOST# openssl pkcs12 -in archivo.pfx -nokeys | openssl x509 -noout -enddate -passin pass:”${pass}”
</div>
<br />
$pass es la variable que contiene el password.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-59539777076667726832021-11-10T20:20:00.000+01:002022-08-31T15:24:18.806+02:00curl: (35) error:1408F10B:SSL routines:ssl3<img border="0" data-original-height="200" data-original-width="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4JF7SgytM81BbNniaOKyDwZMf2PlLMyC5VgexA3cWkGgQw8btV9L85UO0iUo-4r-ni8LDVs0e3yVDoNw2Jo4tXm4as0uUpyWt3M4LjnE-HZXFeOVD-PkGD1LlmI6gxzdHQf16OfrmimM/s1600/nginx.png" style="display: none;" /><span class="subtitulo">curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh47tZ_GPJH5zmvfORkTBv_LDL4QmadQIRO2h7BTVc_UdCydf2L4Sdqcr_LHySKJ_20s5OuHBJ3Yj0Df-3JtYd4_YlZMbXvD_HhcJR5vSssbWoYOG07PMD12KWXLGjpXvKXaRx31Wh2PBc/s1600/nginx.png"><img border="0" class="center" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh47tZ_GPJH5zmvfORkTBv_LDL4QmadQIRO2h7BTVc_UdCydf2L4Sdqcr_LHySKJ_20s5OuHBJ3Yj0Df-3JtYd4_YlZMbXvD_HhcJR5vSssbWoYOG07PMD12KWXLGjpXvKXaRx31Wh2PBc/s1600/nginx.png" width="100%" /></a>
<br />
<br />
Tras apuntar un dominio a un servidor corriendo nginx en modo reverse proxy y acceder al dominio vía línea de comandos mediante curl, me encontré con este error:
<br />
<br />
<b>curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number</b>
<br />
<br />
Tras investigar un poco, vi que me había dejado la directiva ssl en la configuración de nginx.
<br />
<br />
Antes:
<br />
<br />
<div class="terminal">server {
listen 443;
...
}
</div>
<br />
Después (arreglado):
<br />
<br />
<div class="terminal">server {
listen 443 ssl;
...
}
</div>
<br />
Una vez añadido "ssl", la web ya fue accesible vía HTTPS sin problemas.
<br />
<br />
Recordemos que al usar el parámetro "ssl" se indica a los navegadores que todas las conexiones aceptadas en el puerto especificado deben funcionar con SSL/TLS.
<br />
<br />
<br />
Fuentes:
<br />
<br />
<a href="http://nginx.org/en/docs/http/ngx_http_core_module.html#listen" target="_blank">http://nginx.org/en/docs/http/ngx_http_core_module.html#listen</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-34156109311093247132021-11-03T07:38:00.056+01:002022-08-31T14:53:01.646+02:00Guardar archivos como root en vim<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS5AkLcliThYRe7U_nDvRswdXnF3mSAJ31NaX0_rOf1muicbNUjrzvlJ0oXqkmdOuYHsoW5h1JjS3Oos8_NqTrxmNBrqKV5vFOukL0ZAzL77ZOdwm_q0kahrNedSOLwkSrO47RoaEiBmE/s1600/linux.png" style="display: none">
<span class="subtitulo">Cómo guardar archivos como root en vim.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpHSGCLfrBuKCCaT52rEboITzt4FMWX7nirSttpHr7dVwtc-EXcJhkCABOdStEkE5qr4xhMogOnNtIREes2p4Ir_6VonWhtggDeEGaA9FjiMbZxu4OoKpH1fL5lRRk-sMnbu3GYoeh4Vo/s1600/linux.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpHSGCLfrBuKCCaT52rEboITzt4FMWX7nirSttpHr7dVwtc-EXcJhkCABOdStEkE5qr4xhMogOnNtIREes2p4Ir_6VonWhtggDeEGaA9FjiMbZxu4OoKpH1fL5lRRk-sMnbu3GYoeh4Vo/s1600/linux.png" width="100%" class="center" /></a>
<br />
<br />
A veces me he encontrado con que edito un archivo con vim sin haber usado sudo, y luego no puedo guardarlo, con un error en pantalla al ejecutar :wq! que dice algo similar a "advertencia: cambiando un archivo de solo lectura".
<br />
<br />
Si hemos podido leer el fichero significa que podemos guardarlo con otro nombre; no hace falta salir y editar el fichero con sudo. Vim permite hacer esto usando el comando:
<br />
<br />
<div class="terminal">:w otro_nombre
</div>
<br />
No obstante, esta no es la mejor opción, dado que tendríamos que ejecutar una instrucción adicional para reemplazar el archivo que estamos editando:
<br />
<br />
<div class="terminal">!sudo mv otro_nombre %
</div>
<br />
% equivale a poner la ruta del archivo que estamos editando.
<br />
! al principio indica a vim que ejecute una instrucción usando el intérprete del sistema.
<br />
<br />
Para evitar tener que escribir dos instrucciones, podemos ejecutar la siguiente instrucción, todo en uno:
<br />
<br />
<div class="terminal">:w!sudo dd of=%
</div>
<br />
:w ! lo que sigue a ! se ejecuta tomando el búfer (es decir, el archivo) como entrada estándar.
<br />
sudo nos permite ejecutar la instrucción con permisos de root.
<br />
dd of=% toma la entrada estándar y escribe su contenido en el archivo que estamos editando.
<br />
<br />
Como usamos sudo, deberemos introducir nuestra contraseña. Luego pulsamos O y despúes Enter.
<br />
<br />
Como vim permite guardar comandos personalizados, podemos crear el siguiente comando:
<br />
<br />
<div class="terminal">cmap w!! w !sudo dd of=%
</div>
<br />
Así, la próxima vez que editemos un archivo sin haber usado sudo, bastará con ejecutar:
<br />
<br />
<div class="terminal">:w!!
</div>
<br />
Esto nos permitirá guardarlo sin problemas.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-80634752495328669732021-10-27T13:09:00.065+02:002022-08-31T15:50:32.172+02:00AWS cli: subir archivos a S3 <img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizJT8ngxT7NdqnwhA9cErRwUuMva241ylyBChlugJHwgklIX1rfvccTkwOi4FKzmqXW8_4Qix95-uwK_EiEizvdZ28vMb0L7-IRPrPKz_qSvuRW8f8BuyQ43at5aas2_u094SW_fmTn8A/s1600/aws.png" data-original-width="200" data-original-height="200" style="display:none" />
<span class="subtitulo">Cómo subir y sincronizar archivos a un bucket S3 mediante el cli de AWS en Linux.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrDFxQJyKUvj7iuRYKTEXZVYQW1hfl-LAzVu-Evrh1nIL4Lzy5_kYci7FrFz51OScojbPqMfdC74cvw28Dn_IOX5bu2VFz7zA_E5FWvfy_gvqK796k2yLzSDkRXcLhywXobgj0yGOdBOM/s1600/0.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrDFxQJyKUvj7iuRYKTEXZVYQW1hfl-LAzVu-Evrh1nIL4Lzy5_kYci7FrFz51OScojbPqMfdC74cvw28Dn_IOX5bu2VFz7zA_E5FWvfy_gvqK796k2yLzSDkRXcLhywXobgj0yGOdBOM/s1600/0.png" width="100%" class="center" /></a>
<br />
<br />
Veamos cómo subir y sincronizar ficheros a un bucket S3 de AWS.
<br />
<br />
En este ejemplo, el bucket se llama "blai-1".
<br />
<br />
Imaginemos que tenemos 3 archivos en local:
<br />
<br />
<div class="terminal">[ec2-user@ip-10-5-0-143 ~]$
2021-10-27 10:56:21 30318 file1.txt
2021-10-27 10:56:22 43784 file2.txt
2021-10-27 10:56:22 96675 file3.txt
</div>
<br />
Subimos los 3 ficheros al bucket usando "sync files":
<br />
<br />
<div class="terminal">[ec2-user@ip-10-5-0-143 ~]$ aws s3 sync files s3://s3-blai-1/files/
upload: files/file1.txt to s3://s3-blai-1/files/file1.txt
upload: files/file2.txt to s3://s3-blai-1/files/file2.txt
upload: files/file3.txt to s3://s3-blai-1/files/file3.txt
</div>
<br />
Listamos los ficheros presentes en el bucket:
<br />
<br />
<div class="terminal">[ec2-user@ip-10-5-0-143 ~]$ aws s3 ls s3://s3-blai-1/files/
2021-10-27 10:56:31 30318 file1.txt
2021-10-27 10:56:32 43784 file2.txt
2021-10-27 10:56:32 96675 file3.txt
</div>
<br />
Borramos file1.txt en local:
<br />
<br />
<div class="terminal">[ec2-user@ip-10-5-0-143 ~]$ sudo rm files/file1.txt
sudo rm files/file1.txt
</div>
<br />
Hacemos otro sync de archivos, esta vez con el flag delete.
<br />
<br />
El flag "delete" indica que se borre del bucket aquello que no exista en local:
<br />
<br />
<div class="terminal">[ec2-user@ip-10-5-0-143 ~]$ aws s3 sync files s3://s3-blai-1/files/ --delete
delete: s3://s3-blai-1/files/file1.txt
</div>
<br />
Tras la instrucción anterior, listamos los ficheros presentes en el bucket:
<br />
<br />
<div class="terminal">[ec2-user@ip-10-5-0-143 ~]$ aws s3 ls s3://s3-blai-1/files/
2021-10-27 10:56:32 43784 file2.txt
2021-10-27 10:56:32 96675 file3.txt
</div>
<br />
Observamos que file1.txt ya no existe.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-29773739206480101192021-10-20T12:13:00.034+02:002022-08-31T16:16:57.048+02:00SAP: disco al 100%, lleno de logs<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_eEaeMLus8yuSbiaBDjDdOsYS9LclFIb-zKQIQ3sdiFMASvvPV3H9fXtml7q21RzV3vz1z0bwyXv8Fa-HyB3Ni1q4_hwAfFmCvjEaQKWO2_RHF8h-LBXrfEtR0G4DVfqgkD7hFdWrehg/s1600/sap.png" data-original-width="200" data-original-height="200" style="display: none" />
<span class="subtitulo">Cómo liberar espacio ocupado al 100% por logs en SAP.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0N4DCdphOgg_kmvQcCLgnZizuS9hou0yuJNLLnUx24TVn6MRirvLUDH8tmqPzhYqUFNoocJ9SVfs-ij2WGmhHkw4_vxQ5W8SEXRAf61elDmN2r7PiYQp1M0rspYKZ9XixCYS0MVHoh-w/s1600/sap2.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0N4DCdphOgg_kmvQcCLgnZizuS9hou0yuJNLLnUx24TVn6MRirvLUDH8tmqPzhYqUFNoocJ9SVfs-ij2WGmhHkw4_vxQ5W8SEXRAf61elDmN2r7PiYQp1M0rspYKZ9XixCYS0MVHoh-w/s1600/sap2.png" width="100%" /></a>
<br />
<br />
Si un sistema SAP tiene el disco al 100% de ocupación es muy posible que este esté lleno de logs.
<br />
<br />
Se puede comprobar yendo a la carpeta "hdb00004" y observando centenares de ficheros de log.
<br />
<br />
Para reclamar este espacio, podemos hacer lo siguiente:
<br />
<br />
1. En global.ini, cambiar el parámetro log_mode a overwrite
<br />
<br />
2. Reiniciar BBDD y SAP
<br />
<br />
3. Cambiar log_mode a normal
<br />
<br />
4. Reiniciar el sistema de nuevo
<br />
<br />
5. En una ventana de SQL, ejecutar:
<br />
<br />
ALTER SYSTEM RECLAIM LOG
<br />
<br />
Tras ejecutar estos pasos, el espacio en disco debería haberse liberado.
<br />
<br />
<br />
Fuentes:
<br />
<br />
<a href="https://answers.sap.com/questions/337800/sap-business-one-hana---delete-log-files-in-mnt000.html" target="_blank">https://answers.sap.com/questions/337800/sap-business-one-hana---delete-log-files-in-mnt000.html</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-60637984331716346882021-10-13T16:37:00.047+02:002022-08-30T16:50:52.102+02:00Balancear cache en varios discos usando NGINX<img border="0" data-original-height="200" data-original-width="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4JF7SgytM81BbNniaOKyDwZMf2PlLMyC5VgexA3cWkGgQw8btV9L85UO0iUo-4r-ni8LDVs0e3yVDoNw2Jo4tXm4as0uUpyWt3M4LjnE-HZXFeOVD-PkGD1LlmI6gxzdHQf16OfrmimM/s1600/nginx.png" style="display: none;" /><span class="subtitulo">Cómo distribuir el contenido de la cache almacenada en varios discos distintos.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh47tZ_GPJH5zmvfORkTBv_LDL4QmadQIRO2h7BTVc_UdCydf2L4Sdqcr_LHySKJ_20s5OuHBJ3Yj0Df-3JtYd4_YlZMbXvD_HhcJR5vSssbWoYOG07PMD12KWXLGjpXvKXaRx31Wh2PBc/s1600/nginx.png"><img border="0" class="center" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh47tZ_GPJH5zmvfORkTBv_LDL4QmadQIRO2h7BTVc_UdCydf2L4Sdqcr_LHySKJ_20s5OuHBJ3Yj0Df-3JtYd4_YlZMbXvD_HhcJR5vSssbWoYOG07PMD12KWXLGjpXvKXaRx31Wh2PBc/s1600/nginx.png" width="100%" /></a>
<br />
<br />
Hace unos días contaba <a href="/2021/09/guardando-cache-en-un-reverse-proxy.html" target="_blank">cómo guardar contenido cacheado en un NGINX que actúa como reverse proxy</a>. Hoy contaré una característica adicional a la configuración presentada anteriormente.
<br />
<br />
Imaginemos que estamos cacheando contenido en el reverse proxy no tanto para aumentar la velocidad de carga de una web sino para poder presentar ciertas imágenes en caso de que los servidores que las almacenan caigan y dejen de servirlas para asegurar así su disponibilidad.
<br />
<br />
Si tenemos varios discos duros mapeados a la máquina donde está instalado NGINX, podemos usar NGINX para dividir el caché almacenado entre ellos, añadiendo una capa extra a alta disponibilidad.
<br />
<br />
A continuación, un ejemplo que muestra como dividir a los clientes de manera uniforme en dos discos duros distintos según el URI de la solicitud enviada por el cliente:
<br />
<br />
<div class="terminal">proxy_cache_path /path/to/hdd1 levels=1:2 keys_zone=my_cache_hdd1:10m
max_size=10g inactive=60m use_temp_path=off;
proxy_cache_path /path/to/hdd2 levels=1:2 keys_zone=my_cache_hdd2:10m
max_size=10g inactive=60m use_temp_path=off;
split_clients $request_uri $my_cache {
50% “my_cache_hdd1”;
50% “my_cache_hdd2”;
}
server {
# ...
location / {
proxy_cache $my_cache;
proxy_pass http://my_upstream;
}
}
</div>
<br />
Las dos directivas proxy_cache_path definen dos cachés (my_cache_hdd1 y my_cache_hdd2) en dos discos duros diferentes (hdd1 y hdd2), para asegurar la alta disponibilidad.
<br />
<br />
El bloque de configuración split_clients especifica que los resultados de la mitad de las solicitudes (50 %) se almacenan en caché en my_cache_hdd1 y la otra mitad en my_cache_hdd2. El hash basado en la variable $request_uri (el URI de la solicitud) determina qué caché se usa para cada solicitud, lo que da como resultado que las solicitudes de un URI determinado siempre se almacenan en el mismo caché.
<br />
<br />
Mencionar que este enfoque no reemplaza la configuración de un RAID. Si hay una falla en uno de los discos, podría darse un comportamiento impredecible en el sistema, como mostrarse errores 500 a las solicitudes que se dirigieron al disco duro defectuoso.
<br />
<br />
<br />
Fuentes:
<br />
<br />
<a href="https://www.nginx.com/blog/nginx-caching-guide/" target="_blank">https://www.nginx.com/blog/nginx-caching-guide/</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3004084175624619397.post-62097989184883297462021-10-06T10:28:00.020+02:002022-08-30T12:41:06.239+02:00Forzar reboot en Linux<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS5AkLcliThYRe7U_nDvRswdXnF3mSAJ31NaX0_rOf1muicbNUjrzvlJ0oXqkmdOuYHsoW5h1JjS3Oos8_NqTrxmNBrqKV5vFOukL0ZAzL77ZOdwm_q0kahrNedSOLwkSrO47RoaEiBmE/s1600/linux.png" style="display: none">
<span class="subtitulo">Cómo ampliar o extender un volumen LVM en Linux.</span>
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpHSGCLfrBuKCCaT52rEboITzt4FMWX7nirSttpHr7dVwtc-EXcJhkCABOdStEkE5qr4xhMogOnNtIREes2p4Ir_6VonWhtggDeEGaA9FjiMbZxu4OoKpH1fL5lRRk-sMnbu3GYoeh4Vo/s1600/linux.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpHSGCLfrBuKCCaT52rEboITzt4FMWX7nirSttpHr7dVwtc-EXcJhkCABOdStEkE5qr4xhMogOnNtIREes2p4Ir_6VonWhtggDeEGaA9FjiMbZxu4OoKpH1fL5lRRk-sMnbu3GYoeh4Vo/s1600/linux.png" width="100%" class="center" /></a>
<br />
<br />
Queremos reiniciar una máquina Linux, y al ejecutar el comando "reboot" nos encontramos con el siguiente mensaje de error en pantalla:
<br />
<br />
<div class="terminal">HOST # reboot
Failed to open initctl fifo: No such device or address
Failed to talk to init daemon.
</div>
<br />
Independientemente de cuál sea el problema y del estado en el que se encuentre la máquina, la utilidad systemctl permite forzar el reinicio de un Linux "pase lo que pase" de la siguiente manera:
<br />
<br />
<div class="terminal">HOST # systemctl --force --force reboot
Rebooting.
</div>
<br />
Ahora sí, la máquina ya debería estar reiniciándose.
Unknownnoreply@blogger.com0