
{"id":69409,"date":"2023-01-11T08:00:11","date_gmt":"2023-01-11T16:00:11","guid":{"rendered":"https:\/\/github.blog\/?p=69409"},"modified":"2023-01-13T18:53:08","modified_gmt":"2023-01-14T02:53:08","slug":"passwordless-deployments-to-the-cloud","status":"publish","type":"post","link":"https:\/\/github.blog\/enterprise-software\/devsecops\/passwordless-deployments-to-the-cloud\/","title":{"rendered":"Passwordless deployments to the cloud"},"content":{"rendered":"<p>Security is top of mind for us all in software development. My colleague, Mark Paulsen, recently shared a <a href=\"https:\/\/github.blog\/2022-11-04-how-to-mitigate-owasp-vulnerabilities-while-staying-in-the-flow\/\">number of examples to mitigate OWASP vulnerabilities<\/a> while maintaining your developer experience and productivity.<\/p>\n<p>The security of the applications we\u2019re building is important. But we also need to consider the security of the hosting environments that we\u2019re deploying to. When deploying somewhere, you typically need to provide several pieces of information to enable the deployment to take place. Think of your cloud provider. You may need to be authenticated using a service principal, authorized using role-based access control, and the name of a project or an ID to a subscription, or some additional resource metadata.<\/p>\n<p>And here lies the challenge. You will typically have tens, possibly hundreds of service principals depending on the size of your application environment (also assuming you\u2019ve adopted the principle of least privilege). Each of those service principals would have its own password or certificate, which would then be used to authenticate to the cloud provider.<\/p>\n<p><a href=\"https:\/\/owasp.org\/Top10\/A02_2021-Cryptographic_Failures\/\">Cryptographic failures is in position #2 of the OWASP 2021 Top 10 list<\/a> (which would encompass scenarios like secret or certificate leaks, weak passwords, and hardcoded passwords). <a href=\"https:\/\/www.ibm.com\/reports\/data-breach\">IBM\u2019s Cost of a data breach 2022 report<\/a> explains that stolen\/lost credentials were the most common cause of a data breach and also took the longest to identify.<\/p>\n<p>So, what happens if one of your passwords or certificates leaks? <a href=\"https:\/\/docs.github.com\/en\/code-security\/secret-scanning\/about-secret-scanning\">GitHub Advanced Security\u2019s secret scanning <\/a>can identify exposed secrets in your codebase. With <a href=\"https:\/\/docs.github.com\/en\/enterprise-cloud@latest\/code-security\/secret-scanning\/protecting-pushes-with-secret-scanning\">push protection<\/a>, you can be proactive and prevent secrets from being committed in the first place. In case you missed it, <a href=\"https:\/\/github.blog\/changelog\/2022-12-15-secret-scanning-now-push-protects-custom-patterns\/\">push protection now also covers custom patterns which you have defined<\/a>!<\/p>\n<p>But what about the best practice of regularly rotating the passwords\/certificates associated with each of those service principals? How do you keep references of those secret materials up to date in your CI\/CD tool? There is a fair amount of operational complexity involved in just maintaining secrets and access between your tools of choice.<\/p>\n<p>From a Site Reliability Engineering (SRE) perspective, this overhead could be considered as <a href=\"https:\/\/sre.google\/sre-book\/eliminating-toil\/\">toil based on the characteristics defined in Google\u2019s Site Reliability engineering book<\/a>. Toil is unavoidable. But in the context of this blog post, we have the opportunity for optimization. While there are tools like Hashicorp Vault, which can help you organize, automate and maintain your secrets, wouldn\u2019t it be better if you could avoid the problem overall. What if you didn\u2019t have to use secrets to deploy to your preferred cloud provider?<\/p>\n<p>Fortunately, that\u2019s something we\u2019ve been working on at GitHub. <a href=\"https:\/\/github.blog\/changelog\/2021-10-27-github-actions-secure-cloud-deployments-with-openid-connect\/\">Back in 2021<\/a>, we announced that GitHub enables you to deploy to your cloud provider using OpenID Connect. In this post, I\u2019ll provide you with a deeper overview of this functionality and how it can reduce operational complexities by removing the need for passwords.<\/p>\n<h2 id=\"what-is-openid-connect-oidc\"><a class=\"heading-link\" href=\"#what-is-openid-connect-oidc\">What is OpenID Connect (OIDC)?<span class=\"heading-hash pl-2 text-italic text-bold\" aria-hidden=\"true\"><\/span><\/a><\/h2>\n<p>Let\u2019s start by making sure we\u2019re all on the same page. <a href=\"https:\/\/openid.net\/connect\/\">Open ID Connect<\/a> is an authentication protocol, built on top of the <a href=\"https:\/\/oauth.net\/2\/\">OAuth 2.0 framework<\/a> (an authorization protocol). An ID token is usually returned from an authorization endpoint by using a sign-on flow.<\/p>\n<p>This ID token is served in the <a href=\"https:\/\/jwt.io\/introduction\">JSON Web Token (JWT)<\/a> standard, and typically digitally signed. As a result, this token can be used to verify the identity of the caller, and retrieve additional claims (think of these as additional properties, or statements about the entity) as well.<\/p>\n<p>You can find an example of an ID token returned from GitHub Actions below:<\/p>\n<pre><code>{\n  \"typ\": \"JWT\",\n  \"alg\": \"RS256\",\n  \"x5t\": \"example-thumbprint\",\n  \"kid\": \"example-key-id\"\n}\n{\n  \"jti\": \"example-id\",\n  \"sub\": \"repo:octo-org\/octo-repo:environment:prod\",\n  \"environment\": \"prod\",\n  \"aud\": \"https:\/\/github.com\/octo-org\",\n  \"ref\": \"refs\/heads\/main\",\n  \"sha\": \"example-sha\",\n  \"repository\": \"octo-org\/octo-repo\",\n  \"repository_owner\": \"octo-org\",\n  \"actor_id\": \"12\",\n  \"repository_visibility\": private,\n  \"repository_id\": \"74\",\n  \"repository_owner_id\": \"65\",\n  \"run_id\": \"example-run-id\",\n  \"run_number\": \"10\",\n  \"run_attempt\": \"2\",\n  \"actor\": \"octocat\",\n  \"workflow\": \"example-workflow\",\n  \"head_ref\": \"\",\n  \"base_ref\": \"\",\n  \"event_name\": \"workflow_dispatch\",\n  \"ref_type\": \"branch\",\n  \"job_workflow_ref\": \"octo-org\/octo-automation\/.github\/workflows\/oidc.yml@refs\/heads\/main\",\n  \"iss\": \"https:\/\/token.actions.githubusercontent.com\",\n  \"nbf\": 1632492967,\n  \"exp\": 1632493867,\n  \"iat\": 1632493567\n}\n<\/code><\/pre>\n<p>In the context of this blog post, we can use <a href=\"https:\/\/docs.github.com\/en\/actions\/deployment\/security-hardening-your-deployments\/about-security-hardening-with-openid-connect\">OpenID Connect in GitHub Actions<\/a> to generate an ID token for us. This token is signed by GitHub and provides claims on the context of the workflow being executed (for example, the repository details, run number, actor that called the workflow, etc.).<\/p>\n<p>As a result, a cloud provider can then use this ID token to verify the authenticity of a request, allowing a \u2018trade\u2019 of the GitHub ID token for a short-lived access token.<\/p>\n<div class=\"image-frame image-frame-full border rounded-2 overflow-hidden d-flex flex-row flex-justify-center\" style=\"background: #EAEEF2\"><br \/>\n\u200b\u200b<img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/github.blog\/wp-content\/uploads\/2023\/01\/passwordless.png?w=1024&#038;resize=1024%2C348\" alt=\"Diagram showing how a cloud provider can work with GitHub OIDC provider to generate a short-lived token for use in place of a password.\" width=\"1024\" height=\"348\" class=\"aligncenter size-large wp-image-69411 width-fit\" srcset=\"https:\/\/github.blog\/wp-content\/uploads\/2023\/01\/passwordless.png?w=1405 1405w, https:\/\/github.blog\/wp-content\/uploads\/2023\/01\/passwordless.png?w=300 300w, https:\/\/github.blog\/wp-content\/uploads\/2023\/01\/passwordless.png?w=768 768w, https:\/\/github.blog\/wp-content\/uploads\/2023\/01\/passwordless.png?w=1024 1024w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><br \/><\/div>\n<p>Without OpenID Connect, you would typically have to pass in some credentials to your CI\/CD tool, so that it can authenticate to your cloud provider.<\/p>\n<p>GitHub Actions uses OpenID Connect to enable a workflow to authenticate against the cloud provider directly, without needing to use a password or a certificate. Instead, the access token from the cloud provider can be used.<\/p>\n<p>Throughout this process, you are effectively establishing a \u2018trust\u2019 between GitHub and a service principal in your cloud provider. In AWS, you would <a href=\"https:\/\/docs.aws.amazon.com\/IAM\/latest\/UserGuide\/id_roles_providers_create_oidc.html\">add an OIDC provider to IAM<\/a>, in Azure a <a href=\"https:\/\/learn.microsoft.com\/en-us\/graph\/api\/resources\/federatedidentitycredentials-overview?view=graph-rest-1.0\">\u2018Federated Identity Credential<\/a>\u2019 and then <a href=\"https:\/\/cloud.google.com\/iam\/docs\/workload-identity-federation\">\u2018Workload Identity Federation<\/a>\u2019 in GCP.<\/p>\n<div data-target=\"content-table-wrap.container\" class=\"content-table-wrap\"><content-table-wrap><table style=\"border: 1px black\">\n<tbody>\n<tr>\n<td><strong>Tip:<\/strong> this means that your cloud provider needs to support OpenID Connect as an authentication mechanism. There are several <a href=\"https:\/\/docs.github.com\/en\/actions\/deployment\/security-hardening-your-deployments\/about-security-hardening-with-openid-connect\">examples available in the GitHub docs<\/a>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/content-table-wrap><\/div>\n<h2 id=\"setting-up-your-github-action-workflow-for-oidc\"><a class=\"heading-link\" href=\"#setting-up-your-github-action-workflow-for-oidc\">Setting up your GitHub Action Workflow for OIDC<span class=\"heading-hash pl-2 text-italic text-bold\" aria-hidden=\"true\"><\/span><\/a><\/h2>\n<p>Whenever you execute a GitHub Action workflow run, a GitHub Token is created. You may have already referenced this token in your existing workflows using the <code>${{ secrets.GITHUB_TOKEN }}<\/code> expression. The <code>GITHUB_TOKEN<\/code> is typically used to gain access to the needed parts of GitHub for your automation\u2019s needs.<\/p>\n<p>For example, if your workflow is publishing a new package, then you may need write permissions to GitHub Packages. If you\u2019re adding a comment to a GitHub Issue, then you would need write permissions to issues. Check out the GitHub docs for <a href=\"https:\/\/docs.github.com\/en\/actions\/security-guides\/automatic-token-authentication#permissions-for-the-github_token\">full details on permissions for the GITHUB_TOKEN<\/a>.<\/p>\n<p>To generate a GitHub OIDC ID token within your workflow, you\u2019ll need to explicitly give the <code>GITHUB_TOKEN<\/code> permission to do this. This is done by setting the permissions for the <strong>id-token<\/strong> to <strong>write<\/strong>, as demonstrated in the snippet below.<\/p>\n<pre><code>permissions:\n  id-token: write # This is required for requesting the JWT\n<\/code><\/pre>\n<p>This permission can be set either at the overall workflow level, or an individual job level. This will depend on where you need to use the token in your workflow (that is, across  multiple jobs, or just one job\u2014 remember, principle of least privilege\u2014only give the <code>GITHUB_TOKEN<\/code> the access it needs!).<\/p>\n<p>Once this step is complete, your GitHub Action workflow will be capable of requesting the OIDC ID token, as outlined in the next section.<\/p>\n<h2 id=\"authenticating-to-the-cloud-provider-using-the-github-oidc-token\"><a class=\"heading-link\" href=\"#authenticating-to-the-cloud-provider-using-the-github-oidc-token\">Authenticating to the cloud provider using the GitHub OIDC token<span class=\"heading-hash pl-2 text-italic text-bold\" aria-hidden=\"true\"><\/span><\/a><\/h2>\n<p>If you already use GitHub Actions to deploy to the cloud, then you may be aware that there are several GitHub Actions that you can use to authenticate to your cloud provider:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/aws-actions\/configure-aws-credentials\">Configure AWS Credentials GitHub Action<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Azure\/login\/\">Azure Login GitHub Action<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/google-github-actions\/auth\">Google Cloud Auth GitHub Action<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/hashicorp\/vault-action\">Hashicorp Vault GitHub Action<\/a><\/li>\n<\/ul>\n<div data-target=\"content-table-wrap.container\" class=\"content-table-wrap\"><content-table-wrap><table style=\"border: 1px black\">\n<tbody>\n<tr>\n<td><strong>Note:<\/strong> while several cloud providers have GitHub Actions that support OIDC authentication, it\u2019s possible to create a custom action for those providers which do not have an official GitHub action that supports this approach. You can find out more about the process <a href=\"https:\/\/docs.github.com\/en\/actions\/deployment\/security-hardening-your-deployments\/configuring-openid-connect-in-cloud-providers\">in the GitHub docs<\/a>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/content-table-wrap><\/div>\n<p>GitHub Actions typically have multiple properties that can be set, so you need to consider the appropriate configuration for your cloud provider\u2019s action. When configured to use OpenID Connect authentication, the GitHub Action will generate the GitHub ID token, and send that to the cloud provider to be exchanged for the access token to the cloud provider). This can then be used in the later steps of your workflow (for example, additional GitHub Actions or your own scripts), to perform authenticated steps against the cloud provider.<\/p>\n<p>See an example below of logging in to Azure using OIDC:<\/p>\n<pre><code>name: Login to Azure and execute the Azure CLI\non: [push]\n\npermissions:\n  id-token: write\n\njobs: \n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - name: 'Login to Azure using OIDC'\n        uses: azure\/login@v1\n        with:\n          client-id: ${{ secrets.AZURE_CLIENT_ID }}\n          tenant-id: ${{ secrets.AZURE_TENANT_ID }}\n          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}\n\n\n      - name: 'List the Azure Resource Groups'\n        run: |\n          az group list\n<\/code><\/pre>\n<p>There are a few points to note about the above example:<\/p>\n<ul>\n<li>The id-token permission is set to write at the workflow level. If additional jobs were added, then they would also be able to retrieve a GitHub ID token. This could have been configured at the job level, beneath deploy instead. If the id-token permission was not explicitly set to write, then the login step would fail, as the workflow would be unable to retrieve the GitHub ID token.<\/li>\n<li>The Azure\/login step is used to authenticate to Azure. In this configuration, a Client ID, Tenant ID and Subscription ID are properties set on the action. Notice that a password\/certificate is not provided.<\/li>\n<li>Some may consider the ID of the service principal, Azure Active Directory tenant, and Azure Subscription as sensitive information. They are passed in using GitHub Secrets, which would then mask those values if they are outputted in the workflow logs.<\/li>\n<li>The Azure\/login step retrieves the GitHub ID token. It then sends the GitHub ID token to Azure, along with the Service Principal Client ID, Tenant ID and Subscription ID. Azure then validates whether this specific workflow is \u2018allowed\u2019 access. If allowed, then the access token will be sent back to the workflow. Otherwise, the login step will fail, and the workflow will fail.<\/li>\n<li>The command line is then used to list the Azure Resource Groups in the subscription that the above service principal has access to.<\/li>\n<\/ul>\n<div data-target=\"content-table-wrap.container\" class=\"content-table-wrap\"><content-table-wrap><table style=\"border: 1px black\">\n<tbody>\n<tr>\n<td><strong>Note<\/strong>: the configurable properties for each GitHub Action are set by the owner of the action. While client-id, tenant-id and subscription-id are used for the Azure\/login step, these are not the same for actions from the other cloud providers. Make sure to familiarize yourself with the appropriate action for your cloud provider, and the recommended configuration.<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/content-table-wrap><\/div>\n<p>Now, let\u2019s take stock. At this point, you have a GitHub Actions workflow which is capable of generating a GitHub ID token. You can then use a GitHub Action from one of the cloud providers to take the ID token, and exchange it for a short-lived access token. This access token can then be used (based on the role-based access control permissions you have configured on the cloud provider) to execute your workflow steps.<\/p>\n<p>We aren\u2019t using passwords! No longer do we need to worry about rotating certificates, or passwords. Instead, we rely upon the OpenID Connect protocol, and the trust between GitHub and our cloud provider to provide a short-lived access token for use in the workflow. This takes us one step closer to a passwordless world, being able to deploy to our cloud provider without passing a password or certificate!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Discovering passwords in our codebase is probably one of our worst fears. But what if you didn\u2019t need passwords at all, and could deploy to your cloud provider another way? In this post, we explore how you can use OpenID Connect to trust your cloud provider, enabling you to deploy easily, securely and safely, while minimizing the operational overhead associated with secrets (for example, key rotations).<\/p>\n","protected":false},"author":2042,"featured_media":69410,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_gh_post_show_toc":"no","_gh_post_is_no_robots":"no","_gh_post_is_featured":"no","_gh_post_is_excluded":"no","_gh_post_is_unlisted":"no","_gh_post_related_link_1":"","_gh_post_related_link_2":"","_gh_post_related_link_3":"","_gh_post_sq_img":"","_gh_post_sq_img_id":"","_gh_post_cta_title":"","_gh_post_cta_text":"","_gh_post_cta_link":"","_gh_post_cta_button":"Click Here to Learn More","_gh_post_recirc_hide":"no","_gh_post_recirc_col_1":"gh-auto-select","_gh_post_recirc_col_2":"65301","_gh_post_recirc_col_3":"65308","_gh_post_recirc_col_4":"65316","_featured_video":"","_gh_post_additional_query_params":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"{title}\n\n{excerpt}\n\n{url}","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false,"_links_to":"","_links_to_target":""},"categories":[3318,3313],"tags":[],"coauthors":[2855],"class_list":["post-69409","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devsecops","category-enterprise-software"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.4 (Yoast SEO v28.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Passwordless deployments to the cloud - The GitHub Blog<\/title>\n<meta name=\"description\" content=\"Discovering passwords in our codebase is probably one of our worst fears. But what if you didn\u2019t need passwords at all, and could deploy to your cloud provider another way? In this post, we explore how you can use OpenID Connect to trust your cloud provider, enabling you to deploy easily, securely and safely, while minimizing the operational overhead associated with secrets (for example, key rotations).\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/github.blog\/enterprise-software\/devsecops\/passwordless-deployments-to-the-cloud\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Passwordless deployments to the cloud\" \/>\n<meta property=\"og:description\" content=\"Discovering passwords in our codebase is probably one of our worst fears. But what if you didn\u2019t need passwords at all, and could deploy to your cloud provider another way? In this post, we explore how you can use OpenID Connect to trust your cloud provider, enabling you to deploy easily, securely and safely, while minimizing the operational overhead associated with secrets (for example, key rotations).\" \/>\n<meta property=\"og:url\" content=\"https:\/\/github.blog\/enterprise-software\/devsecops\/passwordless-deployments-to-the-cloud\/\" \/>\n<meta property=\"og:site_name\" content=\"The GitHub Blog\" \/>\n<meta property=\"article:published_time\" content=\"2023-01-11T16:00:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-01-14T02:53:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/github.blog\/wp-content\/uploads\/2023\/01\/1200x640-2.png?fit=1200%2C640\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"640\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Chris Reddington\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Chris Reddington\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/github.blog\\\/enterprise-software\\\/devsecops\\\/passwordless-deployments-to-the-cloud\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/github.blog\\\/enterprise-software\\\/devsecops\\\/passwordless-deployments-to-the-cloud\\\/\"},\"author\":{\"name\":\"Chris Reddington\",\"@id\":\"https:\\\/\\\/github.blog\\\/#\\\/schema\\\/person\\\/41d9826cc8ac1ff5046babb473f45cbf\"},\"headline\":\"Passwordless deployments to the cloud\",\"datePublished\":\"2023-01-11T16:00:11+00:00\",\"dateModified\":\"2023-01-14T02:53:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/github.blog\\\/enterprise-software\\\/devsecops\\\/passwordless-deployments-to-the-cloud\\\/\"},\"wordCount\":1677,\"image\":{\"@id\":\"https:\\\/\\\/github.blog\\\/enterprise-software\\\/devsecops\\\/passwordless-deployments-to-the-cloud\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2023\\\/01\\\/1200x640-2.png?fit=1200%2C640\",\"articleSection\":[\"DevSecOps\",\"Enterprise software\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/github.blog\\\/enterprise-software\\\/devsecops\\\/passwordless-deployments-to-the-cloud\\\/\",\"url\":\"https:\\\/\\\/github.blog\\\/enterprise-software\\\/devsecops\\\/passwordless-deployments-to-the-cloud\\\/\",\"name\":\"Passwordless deployments to the cloud - The GitHub Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/github.blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/github.blog\\\/enterprise-software\\\/devsecops\\\/passwordless-deployments-to-the-cloud\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/github.blog\\\/enterprise-software\\\/devsecops\\\/passwordless-deployments-to-the-cloud\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2023\\\/01\\\/1200x640-2.png?fit=1200%2C640\",\"datePublished\":\"2023-01-11T16:00:11+00:00\",\"dateModified\":\"2023-01-14T02:53:08+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/github.blog\\\/#\\\/schema\\\/person\\\/41d9826cc8ac1ff5046babb473f45cbf\"},\"description\":\"Discovering passwords in our codebase is probably one of our worst fears. But what if you didn\u2019t need passwords at all, and could deploy to your cloud provider another way? In this post, we explore how you can use OpenID Connect to trust your cloud provider, enabling you to deploy easily, securely and safely, while minimizing the operational overhead associated with secrets (for example, key rotations).\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/github.blog\\\/enterprise-software\\\/devsecops\\\/passwordless-deployments-to-the-cloud\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/github.blog\\\/enterprise-software\\\/devsecops\\\/passwordless-deployments-to-the-cloud\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/github.blog\\\/enterprise-software\\\/devsecops\\\/passwordless-deployments-to-the-cloud\\\/#primaryimage\",\"url\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2023\\\/01\\\/1200x640-2.png?fit=1200%2C640\",\"contentUrl\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2023\\\/01\\\/1200x640-2.png?fit=1200%2C640\",\"width\":1200,\"height\":640},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/github.blog\\\/enterprise-software\\\/devsecops\\\/passwordless-deployments-to-the-cloud\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/github.blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Enterprise software\",\"item\":\"https:\\\/\\\/github.blog\\\/enterprise-software\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"DevSecOps\",\"item\":\"https:\\\/\\\/github.blog\\\/enterprise-software\\\/devsecops\\\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Passwordless deployments to the cloud\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/github.blog\\\/#website\",\"url\":\"https:\\\/\\\/github.blog\\\/\",\"name\":\"The GitHub Blog\",\"description\":\"Updates, ideas, and inspiration from GitHub to help developers build and design software.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/github.blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/github.blog\\\/#\\\/schema\\\/person\\\/41d9826cc8ac1ff5046babb473f45cbf\",\"name\":\"Chris Reddington\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7f13237cef25f9ea39c7b14998c10240131997a92b727935036e91e8e5a1a91f?s=96&d=mm&r=gf20d0c0e75ed760f3706fb0a941e50f3\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7f13237cef25f9ea39c7b14998c10240131997a92b727935036e91e8e5a1a91f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7f13237cef25f9ea39c7b14998c10240131997a92b727935036e91e8e5a1a91f?s=96&d=mm&r=g\",\"caption\":\"Chris Reddington\"},\"description\":\"Chris is a passionate developer advocate and senior program manager in GitHub\u2019s Developer Relations team. He works with execs, engineering leads, and teams from the smallest of startups, established enterprises, open source communities and individual developers, helping them \u2764\ufe0f GitHub and unlock their software engineering potential.\",\"jobTitle\":\"Sr Program Manager, DevRel Strategy\",\"url\":\"https:\\\/\\\/github.blog\\\/author\\\/chrisreddington\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Passwordless deployments to the cloud - The GitHub Blog","description":"Discovering passwords in our codebase is probably one of our worst fears. But what if you didn\u2019t need passwords at all, and could deploy to your cloud provider another way? In this post, we explore how you can use OpenID Connect to trust your cloud provider, enabling you to deploy easily, securely and safely, while minimizing the operational overhead associated with secrets (for example, key rotations).","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/github.blog\/enterprise-software\/devsecops\/passwordless-deployments-to-the-cloud\/","og_locale":"en_US","og_type":"article","og_title":"Passwordless deployments to the cloud","og_description":"Discovering passwords in our codebase is probably one of our worst fears. But what if you didn\u2019t need passwords at all, and could deploy to your cloud provider another way? In this post, we explore how you can use OpenID Connect to trust your cloud provider, enabling you to deploy easily, securely and safely, while minimizing the operational overhead associated with secrets (for example, key rotations).","og_url":"https:\/\/github.blog\/enterprise-software\/devsecops\/passwordless-deployments-to-the-cloud\/","og_site_name":"The GitHub Blog","article_published_time":"2023-01-11T16:00:11+00:00","article_modified_time":"2023-01-14T02:53:08+00:00","og_image":[{"width":1200,"height":640,"url":"https:\/\/github.blog\/wp-content\/uploads\/2023\/01\/1200x640-2.png?fit=1200%2C640","type":"image\/png"}],"author":"Chris Reddington","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Chris Reddington","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/github.blog\/enterprise-software\/devsecops\/passwordless-deployments-to-the-cloud\/#article","isPartOf":{"@id":"https:\/\/github.blog\/enterprise-software\/devsecops\/passwordless-deployments-to-the-cloud\/"},"author":{"name":"Chris Reddington","@id":"https:\/\/github.blog\/#\/schema\/person\/41d9826cc8ac1ff5046babb473f45cbf"},"headline":"Passwordless deployments to the cloud","datePublished":"2023-01-11T16:00:11+00:00","dateModified":"2023-01-14T02:53:08+00:00","mainEntityOfPage":{"@id":"https:\/\/github.blog\/enterprise-software\/devsecops\/passwordless-deployments-to-the-cloud\/"},"wordCount":1677,"image":{"@id":"https:\/\/github.blog\/enterprise-software\/devsecops\/passwordless-deployments-to-the-cloud\/#primaryimage"},"thumbnailUrl":"https:\/\/github.blog\/wp-content\/uploads\/2023\/01\/1200x640-2.png?fit=1200%2C640","articleSection":["DevSecOps","Enterprise software"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/github.blog\/enterprise-software\/devsecops\/passwordless-deployments-to-the-cloud\/","url":"https:\/\/github.blog\/enterprise-software\/devsecops\/passwordless-deployments-to-the-cloud\/","name":"Passwordless deployments to the cloud - The GitHub Blog","isPartOf":{"@id":"https:\/\/github.blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/github.blog\/enterprise-software\/devsecops\/passwordless-deployments-to-the-cloud\/#primaryimage"},"image":{"@id":"https:\/\/github.blog\/enterprise-software\/devsecops\/passwordless-deployments-to-the-cloud\/#primaryimage"},"thumbnailUrl":"https:\/\/github.blog\/wp-content\/uploads\/2023\/01\/1200x640-2.png?fit=1200%2C640","datePublished":"2023-01-11T16:00:11+00:00","dateModified":"2023-01-14T02:53:08+00:00","author":{"@id":"https:\/\/github.blog\/#\/schema\/person\/41d9826cc8ac1ff5046babb473f45cbf"},"description":"Discovering passwords in our codebase is probably one of our worst fears. But what if you didn\u2019t need passwords at all, and could deploy to your cloud provider another way? In this post, we explore how you can use OpenID Connect to trust your cloud provider, enabling you to deploy easily, securely and safely, while minimizing the operational overhead associated with secrets (for example, key rotations).","breadcrumb":{"@id":"https:\/\/github.blog\/enterprise-software\/devsecops\/passwordless-deployments-to-the-cloud\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/github.blog\/enterprise-software\/devsecops\/passwordless-deployments-to-the-cloud\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/github.blog\/enterprise-software\/devsecops\/passwordless-deployments-to-the-cloud\/#primaryimage","url":"https:\/\/github.blog\/wp-content\/uploads\/2023\/01\/1200x640-2.png?fit=1200%2C640","contentUrl":"https:\/\/github.blog\/wp-content\/uploads\/2023\/01\/1200x640-2.png?fit=1200%2C640","width":1200,"height":640},{"@type":"BreadcrumbList","@id":"https:\/\/github.blog\/enterprise-software\/devsecops\/passwordless-deployments-to-the-cloud\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/github.blog\/"},{"@type":"ListItem","position":2,"name":"Enterprise software","item":"https:\/\/github.blog\/enterprise-software\/"},{"@type":"ListItem","position":3,"name":"DevSecOps","item":"https:\/\/github.blog\/enterprise-software\/devsecops\/"},{"@type":"ListItem","position":4,"name":"Passwordless deployments to the cloud"}]},{"@type":"WebSite","@id":"https:\/\/github.blog\/#website","url":"https:\/\/github.blog\/","name":"The GitHub Blog","description":"Updates, ideas, and inspiration from GitHub to help developers build and design software.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/github.blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/github.blog\/#\/schema\/person\/41d9826cc8ac1ff5046babb473f45cbf","name":"Chris Reddington","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/7f13237cef25f9ea39c7b14998c10240131997a92b727935036e91e8e5a1a91f?s=96&d=mm&r=gf20d0c0e75ed760f3706fb0a941e50f3","url":"https:\/\/secure.gravatar.com\/avatar\/7f13237cef25f9ea39c7b14998c10240131997a92b727935036e91e8e5a1a91f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7f13237cef25f9ea39c7b14998c10240131997a92b727935036e91e8e5a1a91f?s=96&d=mm&r=g","caption":"Chris Reddington"},"description":"Chris is a passionate developer advocate and senior program manager in GitHub\u2019s Developer Relations team. He works with execs, engineering leads, and teams from the smallest of startups, established enterprises, open source communities and individual developers, helping them \u2764\ufe0f GitHub and unlock their software engineering potential.","jobTitle":"Sr Program Manager, DevRel Strategy","url":"https:\/\/github.blog\/author\/chrisreddington\/"}]}},"jetpack_publicize_connections":[],"jetpack_shortlink":"https:\/\/wp.me\/pamS32-i3v","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/github.blog\/wp-content\/uploads\/2023\/01\/1200x640-2.png?fit=1200%2C640","_links":{"self":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts\/69409","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/users\/2042"}],"replies":[{"embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/comments?post=69409"}],"version-history":[{"count":7,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts\/69409\/revisions"}],"predecessor-version":[{"id":69413,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts\/69409\/revisions\/69413"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/media\/69410"}],"wp:attachment":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/media?parent=69409"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/categories?post=69409"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/tags?post=69409"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/coauthors?post=69409"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}