¿Cómo puedo acceder al llavero de forma remota desde la línea de comandos?

23

Estoy almacenando varias contraseñas (por ejemplo, para servidores de correo electrónico remotos) en mi llavero. Desde la línea de comandos, cuando inicie sesión localmente, puedo recuperarlos a través de:

security unlock-keychain ~/Library/Keychains/login.keychain
<enter password>
security find-internet-password -s smtp.gmail.com -a foo@gmail.com
<dumps keychain attributes, not including password>
security find-internet-password -s smtp.gmail.com -a foo@gmail.com -g
<dumps keychain attributes, including password>

Sin embargo, los resultados no se pueden lograr cuando se ejecuta de forma remota (enviando a la caja desde otro lugar):

security unlock-keychain ~/Library/Keychains/login.keychain
<enter password>
security find-internet-password -s smtp.gmail.com -a foo@gmail.com
<dumps keychain attributes, not including password>
security find-internet-password -s smtp.gmail.com -a foo@gmail.com -g
<nothing printed, to stdout or stderr>

Además, el valor de retorno del comando final (usando -g) es 36.

Volqué el resultado de setun inicio de sesión local y lo comparé con uno remoto, y las variables de entorno que faltan son:

Apple_PubSub_Socket_Render
GPG_AGENT_INFO
SECURITYSESSIONID
TERM_PROGRAM
TERM_PROGRAM_VERSION
TERM_SESSION_ID
XPC_FLAGS
XPC_SERVICE_NAME

¿Qué me estoy perdiendo? He SSH_AUTH_SOCKestablecido un valor válido (devuelto desde ssh-agent).

Éter
fuente
Relacionado: Acceso a llavero desde Shell
kenorb

Respuestas:

11

Al reproducir esto para investigar, me doy cuenta de que tengo mi llavero configurado para "Confirmar antes de permitir el acceso". Entonces, cuando realizo el find-internet-passwordlocal con la -gbandera, aparece un cuadro de diálogo que indica que la seguridad quiere usar su información confidencial almacenada en "smtp". gmail.com "en su llavero. Si hago clic en "Permitir", entonces funciona, si hago clic en "Denegar", falla de manera similar al sshcaso, con un código de retorno de 51. Diálogo de confirmación de acceso

Cuando pruebo el comando de forma remota a través de ssh, el -gresultado inmediato es un error, con el estado del 36que está informando.

Sospecho que esto se debe a que, cuando entras ssh, no hay forma de que el sistema muestre un cuadro de diálogo que te permita confirmar que deseas permitir que el securitycomando acceda a esta información.

Pude hacer que el comando funcionara mientras estaba conectado al sshhacer clic primero en la opción "Permitir siempre" al ejecutar el comando localmente. Esto actualiza los permisos en Keychain para que ya no necesite responder al diálogo (incluso localmente), lo que también permite que funcione de forma remota.

Sin embargo, no sé si esto será completamente útil para usted, ya que creo que significa que deberá otorgarle securityacceso preventivo al programa a cualquier elemento de llavero al que desee acceder de forma remota. ¿Es posible escribir un guión para hacer esto?

Si está experimentando esto manualmente y luego desea revocar este acceso, puede ir al elemento afectado en Acceso a llaveros, elegir Obtener información y mirar la pestaña Control de acceso . Verá una entrada para securityallí, que puede eliminar:Diálogo de control de acceso

James Elliott
fuente
He hecho lo mismo: agregué el comando 'seguridad' a la lista "permitir siempre el acceso" (que también se hace haciendo clic en "Permitir siempre" en la ventana emergente que aparece al emitir el comando localmente), pero aún no puedo acceder al artículo del llavero de forma remota a partir de entonces. Debe haber otra configuración en algún lugar que deba modificarse, pero no puedo encontrarla.
Ether
1
ahahaha - esto lo hace realmente el trabajo, pero uno tiene que iniciar sesión con una nueva sesión después de cambiar los ajustes en el llavero para que surtan efecto. ¡Hurra! (Agregaré una respuesta a esta pregunta si alguna vez descubro cómo alterar remotamente los privilegios de acceso, pero configurar las cosas localmente por adelantado para su uso remoto posterior es aceptable por ahora).
Ether
2
También tenga en cuenta: es esencial también ejecutar security unlock-keychain ~/Library/Keychains/login.keychainen la sesión remota donde está tratando de usar el llavero. Esto le pedirá su contraseña, por lo que no puede hacerlo en un script. Puede haber formas de lograr esto sin una contraseña, pero eso está fuera del alcance de esta pregunta :)
Ether
¿Alguien sabe si puedo ingresar la contraseña en la línea de comandos para el llavero de desbloqueo de seguridad?
tofutim
1
@Ether Si el llavero está en la /Users/[user]/Library/Keychains/ruta predeterminada , puede omitir la ruta completa e ir con solo login.keychain.
solgar
5

security -i unlock-keychain

funciona para mí en MacOS 10.13.4 High Sierra.

Después de investigar la solución de karthick, encontré esto. El -i hace que el comando sea interactivo y le solicita su contraseña en el terminal.

Matt Clapp
fuente
3

Mientras el llavero de seguridad esté en la ubicación predeterminada, puede ejecutar el siguiente comando para desbloquearlo. No solicita una contraseña. Funcionó de forma remota.

security unlock-keychain -p "enter password"

karthick
fuente
¡Bienvenido a Ask Different! Estamos tratando de encontrar las mejores respuestas y esas respuestas proporcionarán información de apoyo sobre por qué son las mejores. Las respuestas deben ser independientes, así que explique por qué cree que la respuesta que proporcionó resolverá el problema o es mejor que otras. Proporcionar enlaces como información de apoyo también puede ayudar al OP y a otros a encontrar información adicional por sí mismos. Vea Cómo responder sobre cómo proporcionar una respuesta de calidad. - De la opinión
fsb