- En la versión Tahoe de macOS ahora se admite de forma nativa la creación y uso de claves SSH usando Secure Enclave
- La biblioteca
/usr/lib/ssh-keychain.dylib, además del PKCS11Provider para tarjetas inteligentes existente, implementa la interfaz SecurityKeyProvider, lo que permite comunicarse directamente con Secure Enclave en lugar de usar un dispositivo FIDO2
- Con el comando
sc_auth es posible crear claves con autenticación biométrica basada en Touch ID, y mediante ssh-keygen o ssh-add cargar y usar directamente claves desde la zona segura
- Si se configura la variable de entorno
SSH_SK_PROVIDER en .zprofile, SSH, ssh-agent y ssh-keygen la reconocen automáticamente
- Sin herramientas externas, es posible implementar una estructura de autenticación SSH que combina seguridad y comodidad usando solo funciones nativas de macOS
Resumen del soporte de claves SSH basadas en Secure Enclave
- macOS Tahoe admite la creación y uso de claves SSH basadas en Secure Enclave
- Antes se necesitaban proyectos externos como
secretive, pero ahora puede sustituirse con funciones nativas de macOS
/usr/lib/ssh-keychain.dylib implementa SecurityKeyProvider, permitiendo acceder a Secure Enclave de forma similar a un dispositivo FIDO2
- Gracias a esto, es posible realizar autenticación SSH con el chip de seguridad integrado de macOS sin hardware externo como YubiKey
Creación y administración de claves
- Con el comando
sc_auth create-ctk-identity -l ssh -k p-256-ne -t bio se puede crear una clave de Secure Enclave que requiere autenticación con Touch ID
- Con
list-ctk-identities se puede ver la lista de claves creadas y sus hashes
- Con
delete-ctk-identity se pueden eliminar claves
- Con la opción
list-ctk-identities -t ssh se puede consultar la huella digital (fingerprint) de la clave SSH
Uso en SSH
- Con el comando
ssh-keygen -w /usr/lib/ssh-keychain.dylib -K -N "" se puede cargar un par de claves desde Secure Enclave
- No es necesario ingresar PIN; la autenticación se hace con Touch ID
- La “private key” generada no es la clave secreta real, sino un valor de referencia de credencial FIDO
- Después de copiar la clave pública al servidor con
ssh-copy-id,
se puede conectar usando ssh -o SecurityKeyProvider=/usr/lib/ssh-keychain.dylib localhost
Integración con ssh-agent
- Con
ssh-add -K -S /usr/lib/ssh-keychain.dylib se puede registrar directamente una clave de Secure Enclave en ssh-agent
- Las claves registradas pueden verificarse con
ssh-add -L
- Luego la autenticación se realiza con
ssh -o SecurityKeyProvider=/usr/lib/ssh-keychain.dylib
Configuración predeterminada de SecurityKeyProvider
- Puede indicarse directamente en
.ssh/config o agregando en .zprofile
export SSH_SK_PROVIDER=/usr/lib/ssh-keychain.dylib para reconocimiento automático
- Después, simplemente con
ssh-add -K o ssh my-server se puede hacer conexión SSH basada en clave de seguridad
Claves exportables (Exportable Keys)
- Con
sc_auth create-ctk-identity -l ssh-exportable -k p-256 -t bio se pueden crear claves exportables cifradas con Secure Enclave
- Se pueden exportar como archivo PEM con
export-ctk-identity y
volver a registrar en otro dispositivo con import-ctk-identities
- Este enfoque es algo menos seguro, pero conveniente para respaldos
Discusión de desarrolladores y ampliación del código
- En los comentarios se discutió la posibilidad de usar la bandera
.biometryCurrentSet
- Por ahora solo se admite activar o desactivar el uso de autenticación biométrica, sin control más fino
- El autor estudia la posibilidad de hacer ingeniería inversa (reverse-engineering) a
ssh-keychain.dylib para añadir compatibilidad con biometryCurrentSet en la función sk_enroll()
- El ejemplo de código propuesto requiere firmar el código (codesign) con una cuenta del Apple Developer Program para poder acceder a Secure Enclave
- El código incluye lógica para generación de claves, firma y registro (
sk_enroll, sk_sign, etc.), e implementa el proceso de crear y firmar con claves ECDSA P-256 dentro de Secure Enclave
Resumen
- macOS ahora admite de forma nativa la autenticación SSH usando directamente Secure Enclave
- La autenticación biométrica con Touch ID y una estructura compatible con FIDO2 mejoran la seguridad y la comodidad
- Es posible administrar claves SSH solo con funciones integradas del sistema, sin hardware externo ni software adicional
- Los desarrolladores están experimentando con ampliar
ssh-keychain.dylib para lograr un control biométrico más detallado
1 comentarios
Opiniones en Hacker News
Si entendí bien, esto significa que no se puede respaldar la clave privada
Como se guarda dentro del Secure Enclave, si pierdes la laptop, la clave también desaparece con ella
Parece que solo se puede exportar la clave pública. Claro, quizá haya otros enfoques o un reseteo administrativo posible, pero aun así hay algo de eso que me inquieta
Después el OP dijo que iba a responder y actualizar la página web
man sc_auth. En lugar de generarla directamente en el Secure Enclave, se puede crear una clave cifrada exportableCon comandos de ejemplo como
sc_auth create-ctk-identity -l ssh-exportable -k p-256 -t bio, y luego usarexport-ctk-identitypara crear un archivo.pemEn otro dispositivo se puede volver a cargar con
import-ctk-identities. Voy a agregar esto a la guíaLa esencia de la PKI es mover solo la clave pública, y que la clave privada exista en un solo lugar
Así la clave nunca se filtra bajo ninguna circunstancia
Una clave privada generada en una YubiKey tampoco se puede respaldar
Lo ideal es tener una por dispositivo para que no haya problema si se pierde o roban alguno
Yo guardo una YubiKey protegida con PIN en una caja fuerte. Así estoy cubierto incluso si desaparecen mi laptop, mi teléfono y mi YubiKey de uso diario
Yendo un poco más allá, también se puede hacer firma GPG basada en ECDSA
Eso sí, por un bug se necesita GPG parcheado y un SSH agent
Hay una versión empaquetada con UI para macOS (KeetaNetwork/agent),
y el mismo backend también funciona en Linux con TPM vía PKCS#11
La diferencia entre GPG y SSH es solo la forma de envolver claves y firmas; en el fondo todo es ECDSA
Secretive tiene una configuración más simple, pero voy a cambiarme a este método para usar una app menos
En mi blog dejé cómo configurar claves SSH basadas en TPM en Windows 11
Es una función bastante genial
Yo he usado Secretive durante mucho tiempo, y me resultó mucho más cómodo que una llave o tarjeta física
Cada vez que se usa la clave SSH, hay que presionar un botón o autenticar con huella, así que queda claro cuándo se está usando
Puedes mantener el túnel de ssh-agent y firmar git de forma segura incluso en servidores remotos
Eso sí, la versión Tahoe tiene muchos bugs y se cuelga seguido. No he tenido tiempo de depurarla, así que la dejé así
La UX de SSH basada en Smart Card me hizo sufrir en el pasado, pero si esto es estable, vale la pena probarlo
Con
ssh-askpasspuedes confirmar cada uso de una clave privada. Eso sí, no distingue entre local y remotoOjo con esto, porque usa curvas sobre las que hay sospechas de que la NSA metió una puerta trasera
Si se guarda dentro del Secure Enclave, me pregunto por qué hace falta un archivo de clave privada
skde OpenSSH funciona igual. Incluso con la opción de “resident key”, hace falta un archivo de clave privadaEso no es más que una referencia a la credencial FIDO; no contiene los datos reales de la clave secreta
En las claves
skno residentes, el archivo es necesario porque el autenticador de hardware no guarda estadoNo tengo claro si la implementación de macOS guarda estado o no. Podría romperse al reinstalar el sistema operativo
Existe un proyecto llamado facebookincubator/sks
Es una librería de golang que abstrae varias claves SSH basadas en hardware, con soporte para Linux, Windows y macOS
Por eso hace tiempo empecé a crear yo mismo ssh-tpm-agent
Me gustaría firmar correos o archivos en el iPhone usando la misma clave privada
Me pregunto si iCloud podría encargarse de eso
En cambio, sí se sincronizan las Passkey. Habría que crear un nuevo SecurityKeyProvider que hable con la API de Passkey
Las Passkey están ligadas a un bundle ID de app específico o a un dominio
Por ejemplo, si Secretive soportara Passkey, ese par de claves no podría usarse en otras apps, pero
sí se sincronizaría entre varios dispositivos de la misma app
Ya va siendo hora de agregar una nueva función a KeyMux
Esta herramienta soporta claves enclave para SSH, SSL y PGP, y
por ejemplo permite conectarse a un servidor Vault con un certificado SSL basado en Secure Enclave y realizar autenticación SSH con una clave privada de Vault no exportable
Puedes verlo en keymux.com y en el enlace de la App Store