{"url":"https://api.github.com/gists/32d2abb0be0e2936654d7d169133a94f","forks_url":"https://api.github.com/gists/32d2abb0be0e2936654d7d169133a94f/forks","commits_url":"https://api.github.com/gists/32d2abb0be0e2936654d7d169133a94f/commits","id":"32d2abb0be0e2936654d7d169133a94f","node_id":"MDQ6R2lzdDMyZDJhYmIwYmUwZTI5MzY2NTRkN2QxNjkxMzNhOTRm","git_pull_url":"https://gist.github.com/32d2abb0be0e2936654d7d169133a94f.git","git_push_url":"https://gist.github.com/32d2abb0be0e2936654d7d169133a94f.git","html_url":"https://gist.github.com/michaellihs/32d2abb0be0e2936654d7d169133a94f","files":{"ssh-with-vault.md":{"filename":"ssh-with-vault.md","type":"text/markdown","language":"Markdown","raw_url":"https://gist.githubusercontent.com/michaellihs/32d2abb0be0e2936654d7d169133a94f/raw/b38f904ec3b7e93c687673ac591cc28a0aac5588/ssh-with-vault.md","size":5198,"truncated":false,"content":"Managing SSH authentication with Vault\n======================================\n\nManaging SSH keys with Vault requires 3 steps:\n\n1. Setting up Vault\n2. Setting up the host\n3. Setting up the client / using the signed client keys\n\nFor a full documentation, see this [HashiCorp Blog Post](https://www.vaultproject.io/docs/secrets/ssh/signed-ssh-certificates.html)\n\n\n(0) Challenges with ssh public key authentication\n-------------------------------------------------\n\nFor a good article on this topic, read this [blog post from Uber](https://medium.com/uber-security-privacy/introducing-the-uber-ssh-certificate-authority-4f840839c5cc)\n\n* basic idea: use public/private key pair\n  * keep private part on client's  machine\n  * make public part known to host\n* challenges:\n  * all public keys must be managed\n    * hard to keep track on all of them\n    * removal might lead to security risks (ex-employee still having access to machines...)\n  * ideally, keys should expire after a certain amount of time\n    * ssh keys do not expire\n    * manually invalidating them is brittle\n  * mitigation: 2-factor authentication, e.g. with \n    * problem: inconvenient, users tend to carelessly handle 2FA if annoyed by it\n* solution:\n  * use certification authority for SSH keys\n    * inventory public keys\n    * enable automatic expiration of SSH keys\n    * improve host authentication\n\n\n(1) Set up Vault\n----------------\n\n1. mount a ssh secrets engine\n\n   ```shell\n   vault secrets enable -path=ssh ssh\n   ```\n\n1. configure Vault with a CA for signing client keys using the `/config/ca` endpoint. If you do not have an internal CA, Vault can generate a keypair for you\n\n   ```shell\n   vault write ssh-client-signer/config/ca generate_signing_key=true\n   ```\n\n1. create role for signing client keys\n\n   ```shell\n   vault write ssh/roles/my-role -<<\"EOH\"\n   {\n       \"allow_user_certificates\": true,\n       \"allowed_users\": \"*\",\n       \"valid_principals\": \"vagrant\",\n       \"default_extensions\": [\n           {\n               \"permit-pty\": \"\"\n           }\n       ],\n       \"key_type\": \"ca\",\n       \"default_user\": \"vagrant\",\n       \"ttl\": \"30m0s\"\n   }\n   EOH\n   ```\n   \n\n(2) Set up the host\n-------------------\n\n1. (on the machine running Vault) Obtain the public key for the ssh key signing\n\n   ```shell\n   curl -o /etc/ssh/trusted-user-ca-keys.pem http://127.0.0.1:8200/v1/ssh-client-signer/public_key\n   ```\n\n1. store the public key to a proper location on the target host (e.g. `/etc/ssh/trusted-user-ca-keys.pem`)\n\n1. add the following line to configure sshd to use the public key (`vi /etc/ssh/sshd_config`)\n\n   ```\n   TrustedUserCAKeys /etc/ssh/trusted-user-ca-keys.pem\n   ```\n\n1. restart sshd\n\n   ```shell\n   service sshd restart\n   ```\n\n\n(3) Using the signed keys\n-------------------------\n\n1. Signing a key with Vault\n\n   ```shell\n   vault write -field=signed_key ssh/sign/my-role public_key=@$HOME/.ssh/id_rsa.pub > signed-cert.pub\n   ```\n\n1. Log in to the remote host via\n\n   ```shell\n   ssh -i signed-cert.pub -i ~/.ssh/id_rsa <USER>@<HOST>\n   ```\n\n\n### Convenience wrapper for ssh with signed keys\n\n1. add the following function to your `~/.bashrc`\n\n   ```shell\n   sshv () {\n      vault write -field=signed_key ssh/sign/my-role public_key=@$HOME/.ssh/id_rsa.pub > /tmp/${1}-signed-cert.pub\n      ssh -i /tmp/${1}-signed-cert.pub -i ~/.ssh/id_rsa ${1}\n   }\n   ```\n   \n1. ssh to your host via\n\n   ```shell\n   sshv <USER>@<HOST>\n   ```\n\n\nDebugging\n---------\n\n### SSH issues\n\n* on the host, check the ssh logs via\n\n   ```shell\n   tail -f /var/log/auth.log\n   ```\n   \n   on Centos, the logs are in `/var/log/secure`\n\n* on the client, add `-vvv` to your ssh command\n\n   ```shell\n   ssh -i signed-cert.pub -i ~/.ssh/id_rsa <USER>@<HOST> -vvv\n   ```\n\n* common errors\n\n   ```\n   Dec 15 11:03:42 ipa sshd[2144]: error: Certificate invalid: name is not a listed principal\n   Dec 15 11:17:01 ipa CRON[2154]: pam_unix(cron:session): session opened for user root by (uid=0)\n   Dec 15 11:17:01 ipa CRON[2154]: pam_unix(cron:session): session closed for user root\n   Dec 15 11:29:59 ipa sshd[2165]: error: Certificate invalid: not yet valid\n   Dec 15 11:30:13 ipa sshd[2165]: Connection closed by authenticating user vagrant 192.168.33.1 port 51154 [preauth]\n   Dec 15 11:30:14 ipa sshd[2167]: error: Certificate invalid: not yet valid\n   ```\n\n* `error: Certificate invalid: name is not a listed principal`: add `allowed_principals` to Vagrant role (check above)\n\n* `error: Certificate invalid: not yet valid`: fix date with\n\n   ```shell\n   sudo date --set \"14 Dec 2018 12:35:00\"\n   ```\n\n\n### Check contents of signed key\n\n    ssh-keygen -Lf /tmp/ipa-dev-signed-cert.pub\n\n\n### Check Vault roles\n\n    vault read ssh/roles/<ROLE NAME>\n\n\nReferences\n----------\n\n* [SSH Management at Uber](https://medium.com/uber-security-privacy/introducing-the-uber-ssh-certificate-authority-4f840839c5cc)\n* [Vault SSH Backend](https://www.vaultproject.io/docs/secrets/ssh/signed-ssh-certificates.html)\n* [Vault SSH Backend API](https://www.vaultproject.io/api/secret/ssh/index.html)\n* [Blog Post about Vault SSH Backend](https://www.sweharris.org/post/2016-10-30-ssh-certs/)\n* [Using CA with SSH](https://www.lorier.net/docs/ssh-ca.html)","encoding":"utf-8"}},"public":true,"created_at":"2018-12-13T14:50:44Z","updated_at":"2024-06-27T07:37:23Z","description":"SSH with Vault","comments":0,"user":null,"comments_enabled":true,"comments_url":"https://api.github.com/gists/32d2abb0be0e2936654d7d169133a94f/comments","owner":{"login":"michaellihs","id":575011,"node_id":"MDQ6VXNlcjU3NTAxMQ==","avatar_url":"https://avatars.githubusercontent.com/u/575011?v=4","gravatar_id":"","url":"https://api.github.com/users/michaellihs","html_url":"https://github.com/michaellihs","followers_url":"https://api.github.com/users/michaellihs/followers","following_url":"https://api.github.com/users/michaellihs/following{/other_user}","gists_url":"https://api.github.com/users/michaellihs/gists{/gist_id}","starred_url":"https://api.github.com/users/michaellihs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaellihs/subscriptions","organizations_url":"https://api.github.com/users/michaellihs/orgs","repos_url":"https://api.github.com/users/michaellihs/repos","events_url":"https://api.github.com/users/michaellihs/events{/privacy}","received_events_url":"https://api.github.com/users/michaellihs/received_events","type":"User","user_view_type":"public","site_admin":false},"forks":[{"url":"https://api.github.com/gists/6cb3745eed8c66440523c03184eaf703","user":{"login":"enixdark","id":4610828,"node_id":"MDQ6VXNlcjQ2MTA4Mjg=","avatar_url":"https://avatars.githubusercontent.com/u/4610828?v=4","gravatar_id":"","url":"https://api.github.com/users/enixdark","html_url":"https://github.com/enixdark","followers_url":"https://api.github.com/users/enixdark/followers","following_url":"https://api.github.com/users/enixdark/following{/other_user}","gists_url":"https://api.github.com/users/enixdark/gists{/gist_id}","starred_url":"https://api.github.com/users/enixdark/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/enixdark/subscriptions","organizations_url":"https://api.github.com/users/enixdark/orgs","repos_url":"https://api.github.com/users/enixdark/repos","events_url":"https://api.github.com/users/enixdark/events{/privacy}","received_events_url":"https://api.github.com/users/enixdark/received_events","type":"User","user_view_type":"public","site_admin":false,"name":"Cqshinn","company":null,"blog":"","location":null,"email":null,"hireable":true,"bio":"Technical","twitter_username":"enix_dark","public_repos":1407,"public_gists":119,"followers":138,"following":59,"created_at":"2013-06-04T12:13:51Z","updated_at":"2026-06-27T19:28:25Z"},"id":"6cb3745eed8c66440523c03184eaf703","created_at":"2019-10-30T04:33:00Z","updated_at":"2019-10-30T04:33:01Z"},{"url":"https://api.github.com/gists/bd1654e872a77dcf17aea64da48b5508","user":{"login":"kangli-bionic","id":12615143,"node_id":"MDQ6VXNlcjEyNjE1MTQz","avatar_url":"https://avatars.githubusercontent.com/u/12615143?v=4","gravatar_id":"","url":"https://api.github.com/users/kangli-bionic","html_url":"https://github.com/kangli-bionic","followers_url":"https://api.github.com/users/kangli-bionic/followers","following_url":"https://api.github.com/users/kangli-bionic/following{/other_user}","gists_url":"https://api.github.com/users/kangli-bionic/gists{/gist_id}","starred_url":"https://api.github.com/users/kangli-bionic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kangli-bionic/subscriptions","organizations_url":"https://api.github.com/users/kangli-bionic/orgs","repos_url":"https://api.github.com/users/kangli-bionic/repos","events_url":"https://api.github.com/users/kangli-bionic/events{/privacy}","received_events_url":"https://api.github.com/users/kangli-bionic/received_events","type":"User","user_view_type":"public","site_admin":false,"name":"kangli","company":null,"blog":"","location":"Earth","email":"drz.y.lu@gmail.com","hireable":null,"bio":null,"twitter_username":null,"public_repos":297,"public_gists":168,"followers":11,"following":92,"created_at":"2015-05-26T18:24:27Z","updated_at":"2026-04-15T04:23:54Z"},"id":"bd1654e872a77dcf17aea64da48b5508","created_at":"2021-05-28T07:42:02Z","updated_at":"2021-05-28T07:42:02Z"},{"url":"https://api.github.com/gists/9f7ebb60c9cb74add65cc0ffc59e16db","user":{"login":"romuloslv","id":8976700,"node_id":"MDQ6VXNlcjg5NzY3MDA=","avatar_url":"https://avatars.githubusercontent.com/u/8976700?v=4","gravatar_id":"","url":"https://api.github.com/users/romuloslv","html_url":"https://github.com/romuloslv","followers_url":"https://api.github.com/users/romuloslv/followers","following_url":"https://api.github.com/users/romuloslv/following{/other_user}","gists_url":"https://api.github.com/users/romuloslv/gists{/gist_id}","starred_url":"https://api.github.com/users/romuloslv/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/romuloslv/subscriptions","organizations_url":"https://api.github.com/users/romuloslv/orgs","repos_url":"https://api.github.com/users/romuloslv/repos","events_url":"https://api.github.com/users/romuloslv/events{/privacy}","received_events_url":"https://api.github.com/users/romuloslv/received_events","type":"User","user_view_type":"public","site_admin":false,"name":"Rômulo Silva","company":"@home","blog":"","location":"Recife, Brazil","email":null,"hireable":true,"bio":"daily release notes","twitter_username":null,"public_repos":24,"public_gists":12,"followers":16,"following":22,"created_at":"2014-09-30T20:18:59Z","updated_at":"2026-06-21T11:48:40Z"},"id":"9f7ebb60c9cb74add65cc0ffc59e16db","created_at":"2023-03-14T13:42:31Z","updated_at":"2023-03-14T13:42:31Z"}],"history":[{"user":{"login":"michaellihs","id":575011,"node_id":"MDQ6VXNlcjU3NTAxMQ==","avatar_url":"https://avatars.githubusercontent.com/u/575011?v=4","gravatar_id":"","url":"https://api.github.com/users/michaellihs","html_url":"https://github.com/michaellihs","followers_url":"https://api.github.com/users/michaellihs/followers","following_url":"https://api.github.com/users/michaellihs/following{/other_user}","gists_url":"https://api.github.com/users/michaellihs/gists{/gist_id}","starred_url":"https://api.github.com/users/michaellihs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaellihs/subscriptions","organizations_url":"https://api.github.com/users/michaellihs/orgs","repos_url":"https://api.github.com/users/michaellihs/repos","events_url":"https://api.github.com/users/michaellihs/events{/privacy}","received_events_url":"https://api.github.com/users/michaellihs/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"893b0f3c43b0f2f79763700989b2080da78727d2","committed_at":"2018-12-18T14:10:44Z","change_status":{"total":3,"additions":2,"deletions":1},"url":"https://api.github.com/gists/32d2abb0be0e2936654d7d169133a94f/893b0f3c43b0f2f79763700989b2080da78727d2"},{"user":{"login":"michaellihs","id":575011,"node_id":"MDQ6VXNlcjU3NTAxMQ==","avatar_url":"https://avatars.githubusercontent.com/u/575011?v=4","gravatar_id":"","url":"https://api.github.com/users/michaellihs","html_url":"https://github.com/michaellihs","followers_url":"https://api.github.com/users/michaellihs/followers","following_url":"https://api.github.com/users/michaellihs/following{/other_user}","gists_url":"https://api.github.com/users/michaellihs/gists{/gist_id}","starred_url":"https://api.github.com/users/michaellihs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaellihs/subscriptions","organizations_url":"https://api.github.com/users/michaellihs/orgs","repos_url":"https://api.github.com/users/michaellihs/repos","events_url":"https://api.github.com/users/michaellihs/events{/privacy}","received_events_url":"https://api.github.com/users/michaellihs/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"28e3846c9b4ed2561d071a8f661060ccc5240fb8","committed_at":"2018-12-18T14:09:35Z","change_status":{"total":72,"additions":4,"deletions":68},"url":"https://api.github.com/gists/32d2abb0be0e2936654d7d169133a94f/28e3846c9b4ed2561d071a8f661060ccc5240fb8"},{"user":{"login":"michaellihs","id":575011,"node_id":"MDQ6VXNlcjU3NTAxMQ==","avatar_url":"https://avatars.githubusercontent.com/u/575011?v=4","gravatar_id":"","url":"https://api.github.com/users/michaellihs","html_url":"https://github.com/michaellihs","followers_url":"https://api.github.com/users/michaellihs/followers","following_url":"https://api.github.com/users/michaellihs/following{/other_user}","gists_url":"https://api.github.com/users/michaellihs/gists{/gist_id}","starred_url":"https://api.github.com/users/michaellihs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaellihs/subscriptions","organizations_url":"https://api.github.com/users/michaellihs/orgs","repos_url":"https://api.github.com/users/michaellihs/repos","events_url":"https://api.github.com/users/michaellihs/events{/privacy}","received_events_url":"https://api.github.com/users/michaellihs/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"9dd36d6df67e8c628f782cdb30342e0d94c8104e","committed_at":"2018-12-18T13:32:24Z","change_status":{"total":13,"additions":13,"deletions":0},"url":"https://api.github.com/gists/32d2abb0be0e2936654d7d169133a94f/9dd36d6df67e8c628f782cdb30342e0d94c8104e"},{"user":{"login":"michaellihs","id":575011,"node_id":"MDQ6VXNlcjU3NTAxMQ==","avatar_url":"https://avatars.githubusercontent.com/u/575011?v=4","gravatar_id":"","url":"https://api.github.com/users/michaellihs","html_url":"https://github.com/michaellihs","followers_url":"https://api.github.com/users/michaellihs/followers","following_url":"https://api.github.com/users/michaellihs/following{/other_user}","gists_url":"https://api.github.com/users/michaellihs/gists{/gist_id}","starred_url":"https://api.github.com/users/michaellihs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaellihs/subscriptions","organizations_url":"https://api.github.com/users/michaellihs/orgs","repos_url":"https://api.github.com/users/michaellihs/repos","events_url":"https://api.github.com/users/michaellihs/events{/privacy}","received_events_url":"https://api.github.com/users/michaellihs/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"7000708ad46b2ec61efb4e62991a4bfaa1b8104c","committed_at":"2018-12-18T12:25:40Z","change_status":{"total":67,"additions":67,"deletions":0},"url":"https://api.github.com/gists/32d2abb0be0e2936654d7d169133a94f/7000708ad46b2ec61efb4e62991a4bfaa1b8104c"},{"user":{"login":"michaellihs","id":575011,"node_id":"MDQ6VXNlcjU3NTAxMQ==","avatar_url":"https://avatars.githubusercontent.com/u/575011?v=4","gravatar_id":"","url":"https://api.github.com/users/michaellihs","html_url":"https://github.com/michaellihs","followers_url":"https://api.github.com/users/michaellihs/followers","following_url":"https://api.github.com/users/michaellihs/following{/other_user}","gists_url":"https://api.github.com/users/michaellihs/gists{/gist_id}","starred_url":"https://api.github.com/users/michaellihs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaellihs/subscriptions","organizations_url":"https://api.github.com/users/michaellihs/orgs","repos_url":"https://api.github.com/users/michaellihs/repos","events_url":"https://api.github.com/users/michaellihs/events{/privacy}","received_events_url":"https://api.github.com/users/michaellihs/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"e2f52c950ff3415cf6cb32f942828af1a9b728ea","committed_at":"2018-12-15T12:02:45Z","change_status":{"total":68,"additions":64,"deletions":4},"url":"https://api.github.com/gists/32d2abb0be0e2936654d7d169133a94f/e2f52c950ff3415cf6cb32f942828af1a9b728ea"},{"user":{"login":"michaellihs","id":575011,"node_id":"MDQ6VXNlcjU3NTAxMQ==","avatar_url":"https://avatars.githubusercontent.com/u/575011?v=4","gravatar_id":"","url":"https://api.github.com/users/michaellihs","html_url":"https://github.com/michaellihs","followers_url":"https://api.github.com/users/michaellihs/followers","following_url":"https://api.github.com/users/michaellihs/following{/other_user}","gists_url":"https://api.github.com/users/michaellihs/gists{/gist_id}","starred_url":"https://api.github.com/users/michaellihs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaellihs/subscriptions","organizations_url":"https://api.github.com/users/michaellihs/orgs","repos_url":"https://api.github.com/users/michaellihs/repos","events_url":"https://api.github.com/users/michaellihs/events{/privacy}","received_events_url":"https://api.github.com/users/michaellihs/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"5f90e7779f6a21697bec1b3458a785970eab146b","committed_at":"2018-12-15T11:44:22Z","change_status":{"total":19,"additions":19,"deletions":0},"url":"https://api.github.com/gists/32d2abb0be0e2936654d7d169133a94f/5f90e7779f6a21697bec1b3458a785970eab146b"},{"user":{"login":"michaellihs","id":575011,"node_id":"MDQ6VXNlcjU3NTAxMQ==","avatar_url":"https://avatars.githubusercontent.com/u/575011?v=4","gravatar_id":"","url":"https://api.github.com/users/michaellihs","html_url":"https://github.com/michaellihs","followers_url":"https://api.github.com/users/michaellihs/followers","following_url":"https://api.github.com/users/michaellihs/following{/other_user}","gists_url":"https://api.github.com/users/michaellihs/gists{/gist_id}","starred_url":"https://api.github.com/users/michaellihs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaellihs/subscriptions","organizations_url":"https://api.github.com/users/michaellihs/orgs","repos_url":"https://api.github.com/users/michaellihs/repos","events_url":"https://api.github.com/users/michaellihs/events{/privacy}","received_events_url":"https://api.github.com/users/michaellihs/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"237e14319eaeec3871d1c807f57efd250ed1bd44","committed_at":"2018-12-15T11:37:53Z","change_status":{"total":33,"additions":33,"deletions":0},"url":"https://api.github.com/gists/32d2abb0be0e2936654d7d169133a94f/237e14319eaeec3871d1c807f57efd250ed1bd44"},{"user":{"login":"michaellihs","id":575011,"node_id":"MDQ6VXNlcjU3NTAxMQ==","avatar_url":"https://avatars.githubusercontent.com/u/575011?v=4","gravatar_id":"","url":"https://api.github.com/users/michaellihs","html_url":"https://github.com/michaellihs","followers_url":"https://api.github.com/users/michaellihs/followers","following_url":"https://api.github.com/users/michaellihs/following{/other_user}","gists_url":"https://api.github.com/users/michaellihs/gists{/gist_id}","starred_url":"https://api.github.com/users/michaellihs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaellihs/subscriptions","organizations_url":"https://api.github.com/users/michaellihs/orgs","repos_url":"https://api.github.com/users/michaellihs/repos","events_url":"https://api.github.com/users/michaellihs/events{/privacy}","received_events_url":"https://api.github.com/users/michaellihs/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"005daf445dd004b15fec70ec1ae9927a97b8464c","committed_at":"2018-12-15T11:31:25Z","change_status":{"total":17,"additions":17,"deletions":0},"url":"https://api.github.com/gists/32d2abb0be0e2936654d7d169133a94f/005daf445dd004b15fec70ec1ae9927a97b8464c"},{"user":{"login":"michaellihs","id":575011,"node_id":"MDQ6VXNlcjU3NTAxMQ==","avatar_url":"https://avatars.githubusercontent.com/u/575011?v=4","gravatar_id":"","url":"https://api.github.com/users/michaellihs","html_url":"https://github.com/michaellihs","followers_url":"https://api.github.com/users/michaellihs/followers","following_url":"https://api.github.com/users/michaellihs/following{/other_user}","gists_url":"https://api.github.com/users/michaellihs/gists{/gist_id}","starred_url":"https://api.github.com/users/michaellihs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaellihs/subscriptions","organizations_url":"https://api.github.com/users/michaellihs/orgs","repos_url":"https://api.github.com/users/michaellihs/repos","events_url":"https://api.github.com/users/michaellihs/events{/privacy}","received_events_url":"https://api.github.com/users/michaellihs/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"43137f920f5d358862288d28b7b03d012b93d5a0","committed_at":"2018-12-15T11:28:25Z","change_status":{"total":3,"additions":3,"deletions":0},"url":"https://api.github.com/gists/32d2abb0be0e2936654d7d169133a94f/43137f920f5d358862288d28b7b03d012b93d5a0"},{"user":{"login":"michaellihs","id":575011,"node_id":"MDQ6VXNlcjU3NTAxMQ==","avatar_url":"https://avatars.githubusercontent.com/u/575011?v=4","gravatar_id":"","url":"https://api.github.com/users/michaellihs","html_url":"https://github.com/michaellihs","followers_url":"https://api.github.com/users/michaellihs/followers","following_url":"https://api.github.com/users/michaellihs/following{/other_user}","gists_url":"https://api.github.com/users/michaellihs/gists{/gist_id}","starred_url":"https://api.github.com/users/michaellihs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaellihs/subscriptions","organizations_url":"https://api.github.com/users/michaellihs/orgs","repos_url":"https://api.github.com/users/michaellihs/repos","events_url":"https://api.github.com/users/michaellihs/events{/privacy}","received_events_url":"https://api.github.com/users/michaellihs/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"4fbcce64322ee27b0f43314efe7ea5db760b9ad4","committed_at":"2018-12-15T11:27:10Z","change_status":{"total":4,"additions":2,"deletions":2},"url":"https://api.github.com/gists/32d2abb0be0e2936654d7d169133a94f/4fbcce64322ee27b0f43314efe7ea5db760b9ad4"},{"user":{"login":"michaellihs","id":575011,"node_id":"MDQ6VXNlcjU3NTAxMQ==","avatar_url":"https://avatars.githubusercontent.com/u/575011?v=4","gravatar_id":"","url":"https://api.github.com/users/michaellihs","html_url":"https://github.com/michaellihs","followers_url":"https://api.github.com/users/michaellihs/followers","following_url":"https://api.github.com/users/michaellihs/following{/other_user}","gists_url":"https://api.github.com/users/michaellihs/gists{/gist_id}","starred_url":"https://api.github.com/users/michaellihs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaellihs/subscriptions","organizations_url":"https://api.github.com/users/michaellihs/orgs","repos_url":"https://api.github.com/users/michaellihs/repos","events_url":"https://api.github.com/users/michaellihs/events{/privacy}","received_events_url":"https://api.github.com/users/michaellihs/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"313c444f6c3ed2660c6f4ec03137cf82905ded57","committed_at":"2018-12-15T11:26:56Z","change_status":{},"url":"https://api.github.com/gists/32d2abb0be0e2936654d7d169133a94f/313c444f6c3ed2660c6f4ec03137cf82905ded57"},{"user":{"login":"michaellihs","id":575011,"node_id":"MDQ6VXNlcjU3NTAxMQ==","avatar_url":"https://avatars.githubusercontent.com/u/575011?v=4","gravatar_id":"","url":"https://api.github.com/users/michaellihs","html_url":"https://github.com/michaellihs","followers_url":"https://api.github.com/users/michaellihs/followers","following_url":"https://api.github.com/users/michaellihs/following{/other_user}","gists_url":"https://api.github.com/users/michaellihs/gists{/gist_id}","starred_url":"https://api.github.com/users/michaellihs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaellihs/subscriptions","organizations_url":"https://api.github.com/users/michaellihs/orgs","repos_url":"https://api.github.com/users/michaellihs/repos","events_url":"https://api.github.com/users/michaellihs/events{/privacy}","received_events_url":"https://api.github.com/users/michaellihs/received_events","type":"User","user_view_type":"public","site_admin":false},"version":"b67834773865bfc879333ca08ff2fb6951f56000","committed_at":"2018-12-13T14:50:43Z","change_status":{},"url":"https://api.github.com/gists/32d2abb0be0e2936654d7d169133a94f/b67834773865bfc879333ca08ff2fb6951f56000"}],"truncated":false}