<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ssh &#8211; danisanchez.net</title>
	<atom:link href="https://danisanchez.net/tag/ssh/feed/" rel="self" type="application/rss+xml" />
	<link>https://danisanchez.net</link>
	<description></description>
	<lastBuildDate>Sun, 04 May 2025 12:50:59 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://danisanchez.net/wp-content/uploads/2026/07/cropped-favicon-32x32.png</url>
	<title>ssh &#8211; danisanchez.net</title>
	<link>https://danisanchez.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Iniciar sesión en nuestros VPS mediante SSH Keys</title>
		<link>https://danisanchez.net/iniciar-sesion-en-nuestros-vps-mediante-ssh-keys/</link>
					<comments>https://danisanchez.net/iniciar-sesion-en-nuestros-vps-mediante-ssh-keys/#respond</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Sun, 04 May 2025 12:50:59 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[vps]]></category>
		<guid isPermaLink="false">https://danisanchez.net/?p=14880</guid>

					<description><![CDATA[Hace tiempo que intento mejorar la seguridad de los accesos SSH a mis servidores virtuales, pues creo que la configuración por defecto basada en usuario (root) y contraseña, no es suficiente y el acceso queda expuesto a ataques por fuerza bruta o simples robos de contraseña. Hasta ahora venía usando un doble factor de autenticación [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Hace tiempo que intento mejorar la seguridad de los accesos SSH a mis servidores virtuales, pues creo que la configuración por defecto basada en usuario (root) y contraseña, no es suficiente y el acceso queda expuesto a ataques por fuerza bruta o simples robos de contraseña.</p>



<p class="wp-block-paragraph">Hasta ahora venía usando un doble factor de autenticación basado en Google Authenticator. Aunque el sistema es efectivo, proceso que ya expliqué hace un tiempo en <a href="https://danisanchez.net/anade-doble-factor-de-autenticacion-en-conexiones-ssh-ubuntu-y-derivados/">este artículo</a>, no me gusta la idea de depender de un servicio como Google Authenticator, o de que mi servidor mantenga el paquete google-authenticator en futuras versiones, así que me he pasado al método de acceso por <strong>SSH Keys</strong>. Un método muy seguro basado en el sistema llave pública &#8211; llave secreta, utilizado en infinidad de aplicaciones.</p>



<h2 class="wp-block-heading">Crear las SSH Keys</h2>



<p class="wp-block-paragraph">Crearemos las SSH Keys en nuestra máquina local (yo uso GNU/Linux y lo voy a explicar en base a estos sistemas, si usas otro tipo de sistema operativo, busca información adicional sobre cómo generar SSH Keys) abriendo un terminal y ejecutando el siguiente comando:</p>



<pre class="wp-block-code"><code>ssh-keygen</code></pre>



<p class="wp-block-paragraph">Nos preguntará si deseamos darle un nombre (es conveniente usar un nombre que nos de una pista sobre dónde la vamos a usar), por ejemplo «<strong>keyservidorclientes</strong>«.</p>



<p class="wp-block-paragraph">Si no indicamos ningún nombre, se asignará por defecto: id_rda.</p>



<p class="wp-block-paragraph">La segunda pregunta nos ofrece crear una frase de contraseña para nuestra llave secreta. Es opcional, pero si alguien accede a nuestra máquina local, podría acceder automáticamente a nuestros servidores sin mayor problema. La frase de llave secreta añade un factor de seguridad más para estos casos.</p>



<p class="wp-block-paragraph">Tras asignar el nombre y frase se crearán dos ficheros dentro de /home/user/.ssh/</p>



<ul class="wp-block-list">
<li>keyservidorclientes.pub</li>



<li>keyservidorclientes</li>
</ul>



<p class="wp-block-paragraph">o si no le hemos asignado un nombre al momento de crearlas:</p>



<ul class="wp-block-list">
<li>id_rda.pub</li>



<li>id_rda </li>
</ul>



<p class="wp-block-paragraph">El primer fichero con extensión .pub contiene nuestra llave pública y el fichero sin extensión, nuestra llave secreta.</p>



<h2 class="wp-block-heading">Organizar nuestras SSH Keys</h2>



<p class="wp-block-paragraph">Si vamos a generar muchos SSH Keys para diferentes servidores, una buena práctica es guardar cada par de llaves en directorios diferentes, por ejemplo:</p>



<pre class="wp-block-code"><code>.ssh/servidordesarrollo/keyservidordesarrollo.pub
.ssh/servidordesarrollo/keyservidordesarrollo

.ssh/servidorclientes/keyservidorclientes.pub
.ssh/servidorclientes/keyservidorclientes

.ssh/servidorbackups/keyservidorbackups.pub
.ssh/servidorbackups/keyservidorbackups</code></pre>



<p class="wp-block-paragraph">Después creamos (si no existe) un fichero de configuración donde asociamos cada acceso con la ubicación de sus SSH Keys. Este fichero se llama <strong>config</strong> y debemos ubicarlo en el directorio principal /home/user/.ssh/ </p>



<p class="wp-block-paragraph">Dentro referenciamos cada servidor con la ubicación de sus SSH Keys:</p>



<pre class="wp-block-code"><code>Host servidordesarrollo
	HostName IP o dominio del tu servidor
	User root
	IdentityFile ~/.ssh/servidordesarrollo/keyservidordesarrollo
	
Host servidorclientes
	HostName IP o dominio de tu servidor
	User root
	IdentityFile ~/.ssh/servidorclientes/keyservidorclientes
	
Host servidorbackpus
	HostName IP o dominio de tu servidor
	User root
	IdentityFile ~/.ssh/servidorbackups/keyservidorbackups

...</code></pre>



<p class="wp-block-paragraph">Ahora para conectar con nuestro servidor virtual de clientes solo tenemos que ejecutar:</p>



<pre class="wp-block-code"><code>ssh root@servidorclientes</code></pre>



<p class="wp-block-paragraph">Y para conectar con nuestro servidor de backups sería:</p>



<pre class="wp-block-code"><code>ssh root@servidorbackups</code></pre>



<h2 class="wp-block-heading">Copiar las llaves públicas en nuestros servidores virtuales</h2>



<p class="wp-block-paragraph">Una vez generadas las SSH Keys en nuestra máquina local, tenemos que añadir la llave pública al servidor virtual.</p>



<p class="wp-block-paragraph">Existen herramientas dentro de OpenSSH, que permiten copiar fácilmente nuestra llave pública a nuestro servidor virtual. Pero básicamente lo que hacen es leer nuestro fichero .pub  y copiar su contenido al fichero authorized_keys de nuestro servidor virtual. A mí me gusta hacer este proceso manualmente y asegurarme de que todo se ha llevado a cabo correctamente.</p>



<p class="wp-block-paragraph">Para ello abrimos nuestra llave pública (fichero.pub) con un editor de textos (o desde terminal con cat fichero.pub) y copiamos su contenido.</p>



<p class="wp-block-paragraph">Nos conectamos a nuestro servidor virtual por el método normal SSH por contraseña y editamos con nano (o tu editor preferido), el archivo <strong>/home/user/.ssh/authorized_keys</strong> añadiendo el contenido copiado de nuestra llave pública. (Si queremos añadir otra clave pública, podemos hacerlo a continuación, en una nueva línea. <strong>Cuidado con no soobreesribir otras claves que ha hubiera en el archivo</strong>).</p>



<p class="wp-block-paragraph">A partir de ahora podremos conectar vía SSH con nuestra SSH Key, utilizando la frase de nuestra clave privada en vez de la contraseña de root de nuestro servidor.</p>



<p class="wp-block-paragraph">Esto hace que solo podamos acceder vía SSH desde nuestra máquina local y si conocemos la frase de nuestra clave secreta.</p>



<h2 class="wp-block-heading">Deshabilitar el acceso normal por contraseña</h2>



<p class="wp-block-paragraph">Ahora hay que deshabilitar el acceso normal por contraseña, pues lo que queremos es mejorar la seguridad, de forma que solo se pueda acceder al servidor con la SSH Key.</p>



<p class="wp-block-paragraph">El archivo que tenemos que editar se encuentra en <strong>/etc/ssh/sshd_config</strong>, así que con nano o el editor de terminal que prefieras localizamos la línea:</p>



<pre class="wp-block-code"><code>#PasswordAuthentication yes</code></pre>



<p class="wp-block-paragraph">Descomentamos quitando # y cambiamos a PasswordAuthentication no</p>



<pre class="wp-block-code"><code>PasswordAuthentication no</code></pre>



<p class="wp-block-paragraph">Adicionalmente comprobamos que esta línea está descomentada y en yes:</p>



<pre class="wp-block-code"><code>PubkeyAuthentication yes</code></pre>



<p class="wp-block-paragraph">Y reiniciamos el servicio SSH, en servidores Debian/Ubuntu es:</p>



<pre class="wp-block-code"><code>sudo systemctl restart ssh</code></pre>



<p class="wp-block-paragraph">Antes de cerrar sesión, por precaución, abre un segundo terminal y asegúrate de que puedes iniciar sesión con tu SSH Key. En caso de que no puedas, revierte los cambios anteriores y vuelve a reiniciar el servicio SSH.</p>



<p class="wp-block-paragraph">Si todo ha ido bien, al intentar iniciar sesión mediante contraseña normal, aparecerá el error <strong>permiso denegado</strong>.</p>



<h2 class="wp-block-heading">Posibles problemas con proveedores VPS/Cloud tipo AWS, IONOS, DigitalOceans&#8230;</h2>



<p class="wp-block-paragraph">Si hemos seguido los pasos anteriores y aún así podemos acceder mediante contraseña normal, es posible que nuestro proveedor VPS añada configuraciones adicionales durante el arranque que prevalezcan sobre nuestros cambios.</p>



<p class="wp-block-paragraph">Por ejemplo, los servidores IONOS utilizan <strong>cloud-init</strong>, que añade configuraciones personalizadas durante el arranque que pueden anular nuestras propias modificaciones.</p>



<p class="wp-block-paragraph">Para solucionarlo, vamos hasta el directorio <strong>/etc/cloud/cloud.cfg.d/</strong>.</p>



<p class="wp-block-paragraph">Examinamos si existen archivos de configuración (con extensión .cfg) por si en alguno de ellos estuviese habilitada la opción <strong>PasswordAuthentication yes</strong>. De ser así, lo modificamos a <strong>PasswordAuthentication no</strong>.</p>



<p class="wp-block-paragraph">Reiniciamos el servicio sshd y probamos a conectar vía SSH por el método normal a ver si ahora obtenemos el permiso denegado.</p>



<p class="wp-block-paragraph">Una vez comprobamos cual es el archivo que bloquea nuestra configuración, podemos configurarlo como archivo inmutable, pues en el próximo reinicio del servidor, seguramente se vuelva regenerar con la configuración por defecto.</p>



<p class="wp-block-paragraph">Para ello aplicamos chattr +i sobre el archivo de configuración en cuestión:</p>



<pre class="wp-block-code"><code>sudo chattr +i /etc/ssh/sshd_config.d/archivo.conf </code></pre>



<p class="wp-block-paragraph">Esto hace al archivo inmutable incluso para root.</p>



<p class="wp-block-paragraph">Si tras reiniciar el servidor aún vuelve a habilitarse el acceso SSH por contraseña normal, podríamos como último recurso deshabilitar completamente el cloud-init.</p>



<pre class="wp-block-code"><code>sudo touch /etc/cloud/cloud-init.disabled</code></pre>



<p class="wp-block-paragraph">Y reniciar el servidor.</p>



<p class="wp-block-paragraph"><strong>Aviso: Procede con precaución con esta opción, pues deshabilitar cloud-init, podría romper configuraciones importantes de tu proveedor VPS que provoquen errores futuros en el servidor.</strong></p>



<p class="wp-block-paragraph">Y hasta aquí el tutorial. Espero que como a mí, te sirva de mucha utilidad y securices al máximo tus VPS. Nos vemos en el siguiente post <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/iniciar-sesion-en-nuestros-vps-mediante-ssh-keys/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Añade doble factor de autenticación en conexiones SSH (Ubuntu y derivados)</title>
		<link>https://danisanchez.net/anade-doble-factor-de-autenticacion-en-conexiones-ssh-ubuntu-y-derivados/</link>
					<comments>https://danisanchez.net/anade-doble-factor-de-autenticacion-en-conexiones-ssh-ubuntu-y-derivados/#respond</comments>
		
		<dc:creator><![CDATA[dani.sanchez]]></dc:creator>
		<pubDate>Mon, 11 Oct 2021 09:50:26 +0000</pubDate>
				<category><![CDATA[Publicaciones]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[google authenticator]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[ubuntu]]></category>
		<guid isPermaLink="false">https://www.gestionatuweb.net/?p=11906</guid>

					<description><![CDATA[Probado hasta Ubuntu 24.04 LTS Suelo activar el doble factor de autenticación en todas mis cuentas, ya sean redes sociales, servicios, login de wordpress, etc. Lo tengo activado tanto en la cuenta de cliente de mi proveedor de hosting, como en el acceso al Plesk de mi VPS. Sin embargo, me quedaba una puerta por [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="has-white-color has-text-color has-background wp-block-paragraph" style="background-color:#6d9bda"><strong>Probado hasta Ubuntu 24.04 LTS</strong></p>



<p class="wp-block-paragraph">Suelo activar el doble factor de autenticación en todas mis cuentas, ya sean redes sociales, servicios, login de wordpress, etc.</p>



<p class="wp-block-paragraph">Lo tengo activado tanto en la cuenta de cliente de mi proveedor de hosting, como en el acceso al Plesk de mi VPS.</p>



<p class="wp-block-paragraph">Sin embargo, me quedaba una puerta por securizar, <strong>las conexiones SSH</strong>. </p>



<p class="wp-block-paragraph">Para mí es muy cómodo acceder vía SSH a mi servidor, ya sea para actualizar paquetes, reiniciar el servidor si hay algún problema y acceder a configuraciones concretas.</p>



<p class="wp-block-paragraph">Mi servidor está basado en Ubuntu 22.04 LTS, y existe un paquete para poder configurar el doble factor de autenticación de Google Authenticator en las conexiones SSH. Así que vamos a ello.</p>



<h2 class="wp-block-heading">Instalar y configurar los paquetes requeridos.</h2>



<p class="wp-block-paragraph">El paquete en se llama: <strong>libpam-google-authenticator</strong>.</p>



<pre class="wp-block-code"><code>sudo apt install libpam-google-authenticator</code></pre>



<p class="wp-block-paragraph">Una vez instalado, lo primero que haremos es reiniciar el servicio <strong>sshd</strong>:</p>



<pre class="wp-block-code"><code>sudo systemctl restart sshd.service</code></pre>



<p class="wp-block-paragraph">Ahora editamos con nano el archivo <strong>/etc/pam.d/sshd</strong></p>



<pre class="wp-block-code"><code>sudo nano /etc/pam.d/sshd</code></pre>



<p class="wp-block-paragraph">Y añadimos al final del archivo: </p>



<pre class="wp-block-code"><code>auth required pam_google_authenticator.so</code></pre>



<p class="wp-block-paragraph">Guardamos con Ctrl+O y salimos de nano con Ctrl+X.</p>



<p class="wp-block-paragraph">El siguiente paso es editar el archivo de configuración <strong>/etc/ssh/sshd_config</strong></p>



<pre class="wp-block-code"><code>sudo nano /etc/ssh/sshd_config</code></pre>



<p class="wp-block-paragraph">Lo único que tenemos que hacer es cambiar el parámetro <strong>KbdInteractiveAuthentication</strong> de no a <strong>yes</strong>.</p>



<pre class="wp-block-code"><code># Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
KbdInteractiveAuthentication yes # CAMBIAR ESTO A YES</code></pre>



<p class="wp-block-paragraph">Guardamos con Ctrl+O y salimos de nano con Ctrl+X.</p>



<h2 class="wp-block-heading">Configurar la autenticación</h2>



<p class="wp-block-paragraph">Para ello lanzamos la configuración de google-authenticator:</p>



<pre class="wp-block-code"><code>sudo google-authenticator </code></pre>



<p class="wp-block-paragraph">Nos aparecerá un código QR gigante en la terminal, que es el que debemos escanear con nuestra aplicación de móvil, y además tendremos la lista de códigos de emergencia en caso de que perdamos nuestro dispositivo.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" src="https://danisanchez.net/wp-content/uploads/2021/10/imagen.png" alt="" class="wp-image-11908"/></figure>
</div>


<p class="wp-block-paragraph">Además, nos hará una serie de preguntas. Resumiento, la configuración recomendada sería:</p>



<ul class="wp-block-list">
<li>Make tokens “time-base”: <strong>yes</strong></li>



<li>Update the .google_authenticator file: <strong>yes</strong></li>



<li>Disallow multiple uses: <strong>yes</strong></li>



<li>Increase the original generation time limit: <strong>no</strong></li>



<li>Enable rate-limiting: <strong>yes</strong></li>
</ul>



<h3 class="wp-block-heading has-text-color has-background" style="color:#ffffff;background-color:#dc3545"><strong>Importante</strong></h3>



<p class="wp-block-paragraph">Una vez repondido a todo, <strong>asegúrate de volver a reiniciar el servicio sshd</strong></p>



<pre class="wp-block-code"><code>sudo systemctl restart sshd.service</code></pre>



<p class="wp-block-paragraph">De lo contrario, la próxima vez que intentes iniciar sesión vía SSH es posible que te de un error de login y tendrás que reiniciarlo desde Plesk, CPanel o pedirlo a tu proveedor de hosting.</p>



<p class="wp-block-paragraph">Tras configurar correctamente, la próxima vez que inicies sesión, además de tu contraseña, te pedirá el código de Google Authenticator.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://danisanchez.net/anade-doble-factor-de-autenticacion-en-conexiones-ssh-ubuntu-y-derivados/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
