{"id":78750,"date":"2026-09-26T05:53:26","date_gmt":"2026-09-26T05:53:26","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=78750"},"modified":"2026-09-26T05:53:28","modified_gmt":"2026-09-26T05:53:28","slug":"github-organization-administration-essentials-2-hour-tutorial","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/github-organization-administration-essentials-2-hour-tutorial\/","title":{"rendered":"GitHub Organization Administration Essentials \u2014 2-Hour Tutorial"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Last Verified:<\/strong>&nbsp;September 2026<br><strong>Based on:<\/strong>&nbsp;<em>GitHub Organization Administration \u2014 Complete Reference Guide and Tutorial<\/em><br><strong>Duration:<\/strong>&nbsp;2 hours<br><strong>Audience:<\/strong>&nbsp;GitHub organization owners, DevOps\/platform engineers, developers with delegated administration duties, security administrators, and technical trainers.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">This is the&nbsp;<strong>Essentials<\/strong>&nbsp;version of the complete GitHub Organization Administration guide. It intentionally removes deep enterprise, migration, AI-governance, advanced networking, and large-scale automation material so a learner can understand and practice the&nbsp;<strong>core administration model in about two hours<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The goal is not to memorize every GitHub setting. The goal is to understand the few administration layers that control almost everything:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Identity -&gt; Teams and roles -&gt; Repository access -&gt; Policies -&gt; CI\/CD and security -&gt; Audit\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">By the end of this tutorial, a learner should be able to safely administer a small or medium GitHub organization and understand how the same model scales to enterprise environments.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. Two-Hour Learning Plan<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-right\" data-align=\"right\">Time<\/th><th class=\"has-text-align-left\" data-align=\"left\">Module<\/th><th class=\"has-text-align-left\" data-align=\"left\">Outcome<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-right\" data-align=\"right\">0\u201310 min<\/td><td>Organization foundations<\/td><td>Understand what an organization is and how administration is layered<\/td><\/tr><tr><td class=\"has-text-align-right\" data-align=\"right\">10\u201330 min<\/td><td>People, teams, and roles<\/td><td>Build a maintainable access model<\/td><\/tr><tr><td class=\"has-text-align-right\" data-align=\"right\">30\u201350 min<\/td><td>Repository access and governance<\/td><td>Control repository creation, visibility, and permissions<\/td><\/tr><tr><td class=\"has-text-align-right\" data-align=\"right\">50\u201370 min<\/td><td>Rulesets and custom properties<\/td><td>Apply policy centrally instead of configuring every repository manually<\/td><\/tr><tr><td class=\"has-text-align-right\" data-align=\"right\">70\u201390 min<\/td><td>GitHub Actions administration<\/td><td>Control workflow permissions, actions, runners, secrets, and cloud access<\/td><\/tr><tr><td class=\"has-text-align-right\" data-align=\"right\">90\u2013105 min<\/td><td>Security, apps, tokens, and audit<\/td><td>Protect identities and programmatic access and investigate changes<\/td><\/tr><tr><td class=\"has-text-align-right\" data-align=\"right\">105\u2013115 min<\/td><td>Hands-on organization baseline<\/td><td>Put the essentials together in one practical exercise<\/td><\/tr><tr><td class=\"has-text-align-right\" data-align=\"right\">115\u2013120 min<\/td><td>Review and knowledge check<\/td><td>Confirm the key administration principles<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">What is intentionally outside this 2-hour scope?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The complete reference guide should be used later for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SAML SSO implementation details<\/li>\n\n\n\n<li>SCIM provisioning<\/li>\n\n\n\n<li>Enterprise Managed Users<\/li>\n\n\n\n<li>IP allow lists<\/li>\n\n\n\n<li>Codespaces administration<\/li>\n\n\n\n<li>Copilot, agents, MCP, and AI governance<\/li>\n\n\n\n<li>GitHub Packages administration<\/li>\n\n\n\n<li>GitHub Pages and Discussions administration<\/li>\n\n\n\n<li>Advanced Security and Code Quality rollout<\/li>\n\n\n\n<li>Organization migration<\/li>\n\n\n\n<li>GitHub Enterprise Importer<\/li>\n\n\n\n<li>Detailed billing administration<\/li>\n\n\n\n<li>REST and GraphQL automation<\/li>\n\n\n\n<li>Terraform administration<\/li>\n\n\n\n<li>SIEM and audit streaming<\/li>\n\n\n\n<li>Enterprise-scale operating models<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">These are important, but they are&nbsp;<strong>not prerequisites for understanding core organization administration<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Module 1 \u2014 GitHub Organization Foundations<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">2. What Is a GitHub Organization?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A GitHub Organization is a shared account used to hold and govern software resources for a team or company.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">An organization can contain or control:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Repositories<\/li>\n\n\n\n<li>Teams<\/li>\n\n\n\n<li>Members and owners<\/li>\n\n\n\n<li>Projects<\/li>\n\n\n\n<li>Packages<\/li>\n\n\n\n<li>GitHub Actions<\/li>\n\n\n\n<li>Runners<\/li>\n\n\n\n<li>Secrets and variables<\/li>\n\n\n\n<li>Security controls<\/li>\n\n\n\n<li>GitHub Apps and integrations<\/li>\n\n\n\n<li>Billing and usage<\/li>\n\n\n\n<li>Audit logs<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">An organization is normally&nbsp;<strong>not a login identity<\/strong>. People sign in with their own GitHub accounts and receive organization, team, repository, or delegated administrative permissions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. The Organization Administration Mental Model<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">U<\/span><span class=\"hljs-selector-attr\">&#91;Users]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">T<\/span><span class=\"hljs-selector-attr\">&#91;Teams and Roles]<\/span>\n    <span class=\"hljs-selector-tag\">T<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">R<\/span><span class=\"hljs-selector-attr\">&#91;Repository Access]<\/span>\n    <span class=\"hljs-selector-tag\">R<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">P<\/span><span class=\"hljs-selector-attr\">&#91;Policies and Rulesets]<\/span>\n    <span class=\"hljs-selector-tag\">P<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Actions and Security]<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">L<\/span><span class=\"hljs-selector-attr\">&#91;Audit and Monitoring]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Think of GitHub organization administration in layers:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Identity<\/strong>\u00a0\u2014 Who is the user or automation?<\/li>\n\n\n\n<li><strong>Role or team<\/strong>\u00a0\u2014 What group or administrative responsibility do they have?<\/li>\n\n\n\n<li><strong>Repository access<\/strong>\u00a0\u2014 Which repositories can they access and at what level?<\/li>\n\n\n\n<li><strong>Policy<\/strong>\u00a0\u2014 What actions remain allowed even after access is granted?<\/li>\n\n\n\n<li><strong>Automation and security<\/strong>\u00a0\u2014 What can workflows, runners, secrets, Apps, and tokens do?<\/li>\n\n\n\n<li><strong>Audit<\/strong>\u00a0\u2014 Can you explain who changed what and when?<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">This model is more useful than memorizing the GitHub Settings menu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Organization vs Personal Account<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Capability<\/th><th class=\"has-text-align-left\" data-align=\"left\">Personal account<\/th><th class=\"has-text-align-left\" data-align=\"left\">Organization<\/th><\/tr><\/thead><tbody><tr><td>Login identity<\/td><td>Yes<\/td><td>Normally no<\/td><\/tr><tr><td>Own repositories<\/td><td>Yes<\/td><td>Yes<\/td><\/tr><tr><td>Teams<\/td><td>No<\/td><td>Yes<\/td><\/tr><tr><td>Central repository governance<\/td><td>Limited<\/td><td>Yes<\/td><\/tr><tr><td>Organization roles<\/td><td>No<\/td><td>Yes<\/td><\/tr><tr><td>Organization Actions policy<\/td><td>No<\/td><td>Yes<\/td><\/tr><tr><td>Central security controls<\/td><td>No<\/td><td>Yes<\/td><\/tr><tr><td>Organization audit log<\/td><td>No<\/td><td>Yes<\/td><\/tr><tr><td>Billing delegation<\/td><td>Personal<\/td><td>Owners \/ billing managers<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">5. Organization Owners<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Organization owners have very broad administrative authority.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Typical owner capabilities include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Managing organization settings<\/li>\n\n\n\n<li>Managing membership<\/li>\n\n\n\n<li>Managing teams and roles<\/li>\n\n\n\n<li>Accessing all organization repositories<\/li>\n\n\n\n<li>Configuring policies<\/li>\n\n\n\n<li>Managing application access<\/li>\n\n\n\n<li>Reviewing audit information<\/li>\n\n\n\n<li>Performing organization lifecycle operations<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Recommended ownership model<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use&nbsp;<strong>at least two capable owners for continuity<\/strong>, while keeping the owner population small.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">2\u20134 trusted owners\n        |\n        +-- Security administration -&gt; delegated security role\/team\n        +-- CI\/CD administration -&gt; delegated CI\/CD role\n        +-- Billing -&gt; billing manager\n        +-- GitHub Apps -&gt; App Manager\n        +-- Normal development -&gt; teams + repository roles\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Do not solve every administration requirement by making someone an owner.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Essential rule<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Owner is a break-glass\/high-authority role, not the default senior-engineer role.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Module 2 \u2014 People, Teams, and Roles<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">6. The Main Human Access Types<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Type<\/th><th class=\"has-text-align-left\" data-align=\"left\">Meaning<\/th><th class=\"has-text-align-left\" data-align=\"left\">Typical use<\/th><\/tr><\/thead><tbody><tr><td>Owner<\/td><td>Full organization administration<\/td><td>Small trusted admin group<\/td><\/tr><tr><td>Member<\/td><td>Normal organization participant<\/td><td>Employees and regular contributors<\/td><\/tr><tr><td>Outside collaborator<\/td><td>Access to selected repositories without normal membership<\/td><td>Contractors, vendors, auditors<\/td><\/tr><tr><td>Billing manager<\/td><td>Billing administration without full organization ownership<\/td><td>Finance \/ procurement<\/td><\/tr><tr><td>Team maintainer<\/td><td>Delegated management of a team<\/td><td>Engineering lead \/ manager<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">7. Members vs Outside Collaborators<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A&nbsp;<strong>member<\/strong>&nbsp;belongs to the organization and can participate in teams and organization workflows.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">An&nbsp;<strong>outside collaborator<\/strong>&nbsp;normally receives access only to specific repositories.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Example<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A contractor needs access to one repository for six weeks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Better model:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Contractor\n   |\n   +-- Outside collaborator\n           |\n           +-- payments-api : Write\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Avoid making the contractor a full member unless they genuinely need organization-wide membership capabilities.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">8. Teams \u2014 The Preferred Access Boundary<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Teams are the most important tool for scalable GitHub access management.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Without teams:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Alice -&gt; repo-a\nBob   -&gt; repo-a\nCarol -&gt; repo-a\nAlice -&gt; repo-b\nBob   -&gt; repo-b\n...\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">With teams:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Alice ----+\nBob ------+--&gt; payments-team --&gt; payments repositories\nCarol ----+\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Why teams are better<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Easier onboarding<\/li>\n\n\n\n<li>Easier offboarding<\/li>\n\n\n\n<li>Easier access review<\/li>\n\n\n\n<li>Easier repository ownership<\/li>\n\n\n\n<li>Easier CODEOWNERS integration<\/li>\n\n\n\n<li>Easier permission changes<\/li>\n\n\n\n<li>Less direct-user permission drift<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">9. Example Team Structure<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">engineering\n\u251c\u2500\u2500 platform\n\u2502   \u251c\u2500\u2500 sre\n\u2502   \u2514\u2500\u2500 developer-experience\n\u251c\u2500\u2500 backend\n\u251c\u2500\u2500 mobile\n\u2514\u2500\u2500 security\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use hierarchy only when it represents a meaningful organizational or permission relationship.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Do not create deep team trees just because GitHub supports them.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">10. Team Repository Permissions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub&#8217;s standard repository roles are:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Role<\/th><th class=\"has-text-align-left\" data-align=\"left\">What it is for<\/th><\/tr><\/thead><tbody><tr><td>Read<\/td><td>View and discuss code<\/td><\/tr><tr><td>Triage<\/td><td>Manage issues and pull requests without code write access<\/td><\/tr><tr><td>Write<\/td><td>Normal developer contribution and push access<\/td><\/tr><tr><td>Maintain<\/td><td>Repository operations without the most sensitive admin actions<\/td><\/tr><tr><td>Admin<\/td><td>Full repository administration<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Practical mapping<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">platform-readers  -&gt; Read\nplatform-dev      -&gt; Write\nplatform-maint    -&gt; Maintain\nplatform-admin    -&gt; Admin only when necessary\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Least-privilege question<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Before granting a role, ask:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">What is the lowest role that allows this person or team to do their job?<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">If&nbsp;<code>Write<\/code>&nbsp;works, do not grant&nbsp;<code>Admin<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">11. Base Repository Permission<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Base permission is the default repository access granted to organization members.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A conservative model is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Base permission: None or Read\nNormal developer access: through teams\nAdmin access: exceptional and reviewed\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Effective access<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Base Permission]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Effective Repository Access]<\/span>\n    <span class=\"hljs-selector-tag\">T<\/span><span class=\"hljs-selector-attr\">&#91;Team Permission]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Direct Grant]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Repository Rules Still Apply]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Permission tells GitHub what the user is allowed to attempt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Rulesets and other governance can still restrict what the user may actually do.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">12. Delegated Administration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Not every administrative function needs organization ownership.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use delegated roles where supported:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Responsibility<\/th><th class=\"has-text-align-left\" data-align=\"left\">Better role<\/th><\/tr><\/thead><tbody><tr><td>Security administration<\/td><td>Security Manager<\/td><\/tr><tr><td>Billing<\/td><td>Billing Manager<\/td><\/tr><tr><td>Actions \/ CI administration<\/td><td>CI\/CD administrative role<\/td><\/tr><tr><td>GitHub App registration<\/td><td>App Manager<\/td><\/tr><tr><td>Moderation<\/td><td>Moderator<\/td><\/tr><tr><td>Team membership<\/td><td>Team Maintainer<\/td><\/tr><tr><td>Repository operations<\/td><td>Maintain \/ Admin repository role<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Essential rule<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Use owner only when the job genuinely requires organization-wide authority.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Module 3 \u2014 Repository Access and Governance<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">13. Repository Lifecycle<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Repositories move through a lifecycle:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Create]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Active]<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">X<\/span><span class=\"hljs-selector-attr\">&#91;Archive]<\/span>\n    <span class=\"hljs-selector-tag\">X<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">A<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">T<\/span><span class=\"hljs-selector-attr\">&#91;Transfer]<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Delete]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Important administrative operations include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Create<\/li>\n\n\n\n<li>Import<\/li>\n\n\n\n<li>Change visibility<\/li>\n\n\n\n<li>Transfer<\/li>\n\n\n\n<li>Archive \/ unarchive<\/li>\n\n\n\n<li>Delete \/ restore when eligible<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">14. Repository Visibility<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Visibility<\/th><th class=\"has-text-align-left\" data-align=\"left\">Main audience<\/th><\/tr><\/thead><tbody><tr><td>Public<\/td><td>Anyone on the internet<\/td><\/tr><tr><td>Private<\/td><td>Explicitly authorized users, teams, and integrations<\/td><\/tr><tr><td>Internal<\/td><td>Eligible enterprise users across enterprise organizations<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Changing repository visibility can expose much more than source files.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Potentially affected data can include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Code<\/li>\n\n\n\n<li>Issues<\/li>\n\n\n\n<li>Pull requests<\/li>\n\n\n\n<li>Releases<\/li>\n\n\n\n<li>Actions history<\/li>\n\n\n\n<li>Repository metadata<\/li>\n\n\n\n<li>Pages or package relationships<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Therefore, visibility changes should be treated as a governance decision.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">15. Member Privileges<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Organization settings can govern what normal members may do.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Important questions include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Can members create repositories?<\/li>\n\n\n\n<li>Can they create public repositories?<\/li>\n\n\n\n<li>Can they change repository visibility?<\/li>\n\n\n\n<li>Can they delete repositories?<\/li>\n\n\n\n<li>Can they transfer repositories?<\/li>\n\n\n\n<li>Can they create teams?<\/li>\n\n\n\n<li>Can they install or request GitHub Apps?<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Sensible starting point for a governed company organization<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Capability<\/th><th class=\"has-text-align-left\" data-align=\"left\">Starting position<\/th><\/tr><\/thead><tbody><tr><td>Create private repositories<\/td><td>Allow only if self-service creation is intentional<\/td><\/tr><tr><td>Create public repositories<\/td><td>Restrict unless open-source publishing is expected<\/td><\/tr><tr><td>Change visibility<\/td><td>Restricted \/ governed<\/td><\/tr><tr><td>Delete repositories<\/td><td>Restricted and auditable<\/td><\/tr><tr><td>Transfer outside organization<\/td><td>Restricted<\/td><\/tr><tr><td>Install GitHub Apps<\/td><td>Approved process<\/td><\/tr><tr><td>Create teams<\/td><td>Centralized or intentionally delegated<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The objective is not to lock everything down.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The objective is to make&nbsp;<strong>high-risk actions deliberate<\/strong>&nbsp;while allowing routine engineering work to remain fast.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">16. Pull Request Governance<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Common protections for important branches include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Require pull requests before merge<\/li>\n\n\n\n<li>Require approvals<\/li>\n\n\n\n<li>Require CODEOWNER review<\/li>\n\n\n\n<li>Require status checks<\/li>\n\n\n\n<li>Dismiss stale approvals when appropriate<\/li>\n\n\n\n<li>Restrict force pushes<\/li>\n\n\n\n<li>Restrict branch deletion<\/li>\n\n\n\n<li>Require signed commits when needed<\/li>\n\n\n\n<li>Use merge queue when appropriate<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">For multiple repositories, prefer organization-level&nbsp;<strong>rulesets<\/strong>&nbsp;instead of configuring protections independently on every repository.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Module 4 \u2014 Rulesets and Custom Properties<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">17. Why Rulesets Matter<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Rulesets let administrators apply repository policy centrally.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Without rulesets:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">repo-a -&gt; branch settings\nrepo-b -&gt; branch settings\nrepo-c -&gt; branch settings\nrepo-d -&gt; branch settings\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Over time, these settings drift.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With organization rulesets:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Organization policy\n       |\n       +--&gt; matching repository A\n       +--&gt; matching repository B\n       +--&gt; matching repository C\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">18. Typical Ruleset Controls<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Rulesets can enforce controls such as:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pull request required<\/li>\n\n\n\n<li>Approval required<\/li>\n\n\n\n<li>CODEOWNER review<\/li>\n\n\n\n<li>Required status checks<\/li>\n\n\n\n<li>No force push<\/li>\n\n\n\n<li>No branch deletion<\/li>\n\n\n\n<li>Signed commits<\/li>\n\n\n\n<li>Linear history<\/li>\n\n\n\n<li>Merge queue where applicable<\/li>\n\n\n\n<li>Tag restrictions<\/li>\n\n\n\n<li>Push restrictions<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">19. What Are Custom Properties?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Custom properties are structured metadata attached to repositories.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Useful examples:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Property<\/th><th class=\"has-text-align-left\" data-align=\"left\">Example values<\/th><\/tr><\/thead><tbody><tr><td><code>owner_team<\/code><\/td><td><code>platform<\/code>,&nbsp;<code>payments<\/code>,&nbsp;<code>mobile<\/code><\/td><\/tr><tr><td><code>service_tier<\/code><\/td><td><code>tier-1<\/code>,&nbsp;<code>tier-2<\/code>,&nbsp;<code>tier-3<\/code><\/td><\/tr><tr><td><code>data_classification<\/code><\/td><td><code>public<\/code>,&nbsp;<code>internal<\/code>,&nbsp;<code>confidential<\/code><\/td><\/tr><tr><td><code>production<\/code><\/td><td><code>true<\/code>,&nbsp;<code>false<\/code><\/td><\/tr><tr><td><code>lifecycle<\/code><\/td><td><code>active<\/code>,&nbsp;<code>maintenance<\/code>,&nbsp;<code>deprecated<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">20. Properties + Rulesets = Dynamic Governance<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is one of the most useful GitHub organization patterns.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Repository: payments-api\nservice_tier = tier<span class=\"hljs-number\">-1<\/span>\nowner_team   = payments\nproduction   = <span class=\"hljs-literal\">true<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then create a ruleset that says:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">If service_tier = tier<span class=\"hljs-number\">-1<\/span>\nthen\n  <span class=\"hljs-built_in\">require<\/span> pull request\n  <span class=\"hljs-built_in\">require<\/span> approvals\n  <span class=\"hljs-built_in\">require<\/span> CI checks\n  block force push\n  block <span class=\"hljs-keyword\">default<\/span>-branch deletion\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Now every repository classified as&nbsp;<code>tier-1<\/code>&nbsp;can receive the same policy automatically.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">21. Recommended Rollout<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Define only a few high-value properties.<\/li>\n\n\n\n<li>Set values on test repositories.<\/li>\n\n\n\n<li>Create a ruleset targeting those repositories.<\/li>\n\n\n\n<li>Test normal development behavior.<\/li>\n\n\n\n<li>Test admin and emergency behavior.<\/li>\n\n\n\n<li>Review bypass permissions.<\/li>\n\n\n\n<li>Expand the target set gradually.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Avoid<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Hundreds of free-text properties<\/li>\n\n\n\n<li>Bypass access for large groups<\/li>\n\n\n\n<li>Organization-wide enforcement without testing<\/li>\n\n\n\n<li>Required status checks whose workflow names are inconsistent<\/li>\n\n\n\n<li>Using repository naming alone as your governance database<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Module 5 \u2014 GitHub Actions Administration Essentials<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">22. Why Actions Is an Organization Administration Concern<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub Actions is an execution platform.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It can:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Run arbitrary code<\/li>\n\n\n\n<li>Use repository permissions<\/li>\n\n\n\n<li>Read secrets<\/li>\n\n\n\n<li>Publish packages<\/li>\n\n\n\n<li>Call cloud APIs<\/li>\n\n\n\n<li>Deploy applications<\/li>\n\n\n\n<li>Access internal networks through runners<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Therefore, Actions must be governed like other production automation systems.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">23. The Five Actions Control Layers<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">P<\/span><span class=\"hljs-selector-attr\">&#91;Actions Policy]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">W<\/span><span class=\"hljs-selector-attr\">&#91;Workflow Permissions]<\/span>\n    <span class=\"hljs-selector-tag\">W<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Allowed Actions]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">R<\/span><span class=\"hljs-selector-attr\">&#91;Runners]<\/span>\n    <span class=\"hljs-selector-tag\">R<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">S<\/span><span class=\"hljs-selector-attr\">&#91;Secrets and OIDC]<\/span>\n    <span class=\"hljs-selector-tag\">S<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">M<\/span><span class=\"hljs-selector-attr\">&#91;Audit and Usage]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Layer 1 \u2014 Is Actions allowed?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">An organization can allow, limit, or disable Actions according to policy.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Layer 2 \u2014 What may&nbsp;<code>GITHUB_TOKEN<\/code>&nbsp;do?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A strong baseline is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">Default<\/span> GITHUB_TOKEN: restricted \/ read-oriented\nWorkflow: request extra permissions explicitly\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">name<\/span>: test\n\non:\n  push:\n    branches: &#91;main]\n\npermissions:\n  contents: read\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\/checkout@&lt;FULL_COMMIT_SHA&gt;\n      - run: npm ci\n      - run: npm test\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The workflow requests only the permission it needs.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Layer 3 \u2014 Which Actions are trusted?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Possible organization strategies include:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Maturity<\/th><th class=\"has-text-align-left\" data-align=\"left\">Example policy<\/th><\/tr><\/thead><tbody><tr><td>Basic<\/td><td>Allow GitHub and verified actions<\/td><\/tr><tr><td>Controlled<\/td><td>Allow approved third-party actions<\/td><\/tr><tr><td>Higher assurance<\/td><td>Allowlist plus immutable SHA pinning<\/td><\/tr><tr><td>Regulated<\/td><td>Approved reusable workflows and controlled runner groups<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Third-party Actions are code dependencies and should be reviewed accordingly.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Layer 4 \u2014 Where does the workflow run?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Runner types include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GitHub-hosted runners<\/li>\n\n\n\n<li>Larger GitHub-hosted runners<\/li>\n\n\n\n<li>Self-hosted runners<\/li>\n\n\n\n<li>Autoscaled or ephemeral self-hosted runners<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Runner groups can restrict which repositories or workflows may use a runner set.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example trust separation:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">general-ci       -&gt; normal builds <span class=\"hljs-keyword\">and<\/span> tests\ninternal-ci      -&gt; <span class=\"hljs-keyword\">private<\/span> internal workloads\nstaging-deploy   -&gt; selected deployment workflows\nprod-deploy      -&gt; tightly restricted production deployment workflows\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Do not give every repository access to a privileged production runner.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Layer 5 \u2014 How are credentials provided?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Prefer:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">GitHub permissions -&gt; GITHUB_TOKEN\nCloud credentials  -&gt; OIDC where practical\nShared configuration -&gt; organization variables\nSecrets -&gt; minimum required repository scope\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">24. Organization Secrets vs Variables<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Secrets<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use for sensitive values.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>API tokens<\/li>\n\n\n\n<li>Passwords<\/li>\n\n\n\n<li>Signing material<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Scope secrets only to repositories that require them.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">gh secret <span class=\"hljs-keyword\">set<\/span> DEPLOY_TOKEN \\\n  --org acme \\\n  --visibility selected \\\n  --repos api,worker\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Variables<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use for non-secret configuration.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">gh variable <span class=\"hljs-keyword\">set<\/span> DEFAULT_REGION \\\n  --org acme \\\n  --body \"ap-northeast-1\" \\\n  --visibility selected \\\n  --repos api,worker\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Essential rule<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>A shared organization secret creates a shared blast radius. Scope it deliberately.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">25. OIDC Instead of Long-Lived Cloud Keys<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub Actions can use OpenID Connect to request short-lived cloud credentials.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Conceptually:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Workflow\n   |\n   +--&gt; GitHub OIDC token\n            |\n            +--&gt; Cloud IAM trust policy\n                      |\n                      +--&gt; Short-lived credentials\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is generally safer than copying long-lived AWS, Azure, or GCP keys into many repository secrets.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The cloud trust policy should restrict which organization, repository, branch, environment, or workflow may receive credentials.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Module 6 \u2014 Security, Apps, Tokens, and Audit<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">26. Authentication Security<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">At minimum, organization administrators should understand:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Two-factor authentication<\/li>\n\n\n\n<li>SAML SSO in enterprise environments<\/li>\n\n\n\n<li>SCIM provisioning in enterprise environments<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">For this Essentials course, remember the distinction:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">2FA  -&gt; strengthens user login\nSAML -&gt; enterprise authentication \/ SSO\nSCIM -&gt; user provisioning and deprovisioning lifecycle\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">SAML and SCIM are important enterprise subjects, but they require their own implementation lesson.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">27. Programmatic Access Hierarchy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When software needs access to GitHub, prefer the narrowest appropriate mechanism.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A practical preference order is:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>GitHub App installation token for service automation<\/li>\n\n\n\n<li><code>GITHUB_TOKEN<\/code>\u00a0inside GitHub Actions when sufficient<\/li>\n\n\n\n<li>OIDC for external cloud credentials<\/li>\n\n\n\n<li>Fine-grained PAT for narrow human or automation use<\/li>\n\n\n\n<li>Classic PAT only when a required integration still depends on it<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">28. Why GitHub Apps Are Preferred for Services<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub Apps can provide:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Granular permissions<\/li>\n\n\n\n<li>Selected repository access<\/li>\n\n\n\n<li>Short-lived installation tokens<\/li>\n\n\n\n<li>Webhooks<\/li>\n\n\n\n<li>Independent application identity<\/li>\n\n\n\n<li>Better ownership than a personal account token<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Avoid this pattern:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Owner's personal PAT -&gt; production automation\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Prefer:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">GitHub App -&gt; selected repositories -&gt; required permissions only\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">29. Audit Log<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The organization audit log helps answer:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Who changed this setting?<\/li>\n\n\n\n<li>Who added or removed this user?<\/li>\n\n\n\n<li>Who changed a role?<\/li>\n\n\n\n<li>Who created or transferred this repository?<\/li>\n\n\n\n<li>Who changed an Actions policy?<\/li>\n\n\n\n<li>Who installed or changed an integration?<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Typical event data includes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Actor<\/li>\n\n\n\n<li>Action<\/li>\n\n\n\n<li>Resource<\/li>\n\n\n\n<li>Repository or organization<\/li>\n\n\n\n<li>Timestamp<\/li>\n\n\n\n<li>Additional context depending on event and plan<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Useful CLI starter commands<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> ORG=<span class=\"hljs-string\">\"acme\"<\/span>\n\ngh auth status\n\ngh api <span class=\"hljs-string\">\"\/orgs\/$ORG\"<\/span>\n\ngh api --paginate <span class=\"hljs-string\">\"\/orgs\/$ORG\/members\"<\/span>\n\ngh api --paginate <span class=\"hljs-string\">\"\/orgs\/$ORG\/teams\"<\/span>\n\ngh api <span class=\"hljs-string\">\"\/orgs\/$ORG\/actions\/permissions\"<\/span>\n\ngh api <span class=\"hljs-string\">\"\/orgs\/$ORG\/properties\/schema\"<\/span>\n\ngh api --paginate <span class=\"hljs-string\">\"\/orgs\/$ORG\/audit-log\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use the audit log whenever an organization setting appears to have \u201cchanged by itself.\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Often the real problem is that multiple people or automation systems are modifying the same configuration.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">30. Security Baseline Checklist<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For a normal engineering organization, start with:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] At least two organization owners<\/li>\n\n\n\n<li>[ ] Owner population kept small<\/li>\n\n\n\n<li>[ ] Strong authentication required according to organization plan\/model<\/li>\n\n\n\n<li>[ ] Team-based repository access<\/li>\n\n\n\n<li>[ ] Conservative base repository permission<\/li>\n\n\n\n<li>[ ] Public repository creation restricted when not required<\/li>\n\n\n\n<li>[ ] Repository visibility changes controlled<\/li>\n\n\n\n<li>[ ] Rulesets protecting important branches<\/li>\n\n\n\n<li>[ ] Default\u00a0<code>GITHUB_TOKEN<\/code>\u00a0permissions conservative<\/li>\n\n\n\n<li>[ ] Third-party Actions controlled<\/li>\n\n\n\n<li>[ ] Organization secrets scoped narrowly<\/li>\n\n\n\n<li>[ ] OIDC preferred for cloud deployments<\/li>\n\n\n\n<li>[ ] GitHub Apps preferred over shared PATs<\/li>\n\n\n\n<li>[ ] Outside collaborators reviewed<\/li>\n\n\n\n<li>[ ] Audit log used for high-risk changes<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Module 7 \u2014 10-Minute Hands-On Essentials Lab<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">31. Scenario<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You are administering a training organization named:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">acme-engineering\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The organization contains two repositories:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">payments-api\npayments-web\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Five developers work on both repositories.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Your job is to build a simple but scalable access and governance model.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">32. Lab Step 1 \u2014 Create a Team<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">payments\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Add the five developers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Make one senior engineer a&nbsp;<strong>team maintainer<\/strong>&nbsp;rather than an organization owner.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">33. Lab Step 2 \u2014 Assign Repository Access<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Grant the&nbsp;<code>payments<\/code>&nbsp;team:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Write -&gt; payments-api\nWrite -&gt; payments-web\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Remove redundant direct developer grants where safe to do so.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Expected result<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Repository access is now controlled mainly through team membership.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">34. Lab Step 3 \u2014 Add Repository Metadata<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create a custom property:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">service_tier\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Values:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">tier-1\ntier-2\ntier-3\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Assign:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">payments-api -&gt; tier-1\npayments-web -&gt; tier-1\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">35. Lab Step 4 \u2014 Protect Tier-1 Repositories<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create a test organization ruleset that targets the two tier-1 repositories.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Protect the default branch with:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pull request required<\/li>\n\n\n\n<li>At least one approval<\/li>\n\n\n\n<li>CI check required if a stable test check exists<\/li>\n\n\n\n<li>Force push restricted<\/li>\n\n\n\n<li>Branch deletion restricted<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Test this on a disposable training repository before broad enforcement.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">36. Lab Step 5 \u2014 Check Actions Policy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Review:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Whether Actions is enabled<\/li>\n\n\n\n<li>What third-party Actions are allowed<\/li>\n\n\n\n<li>Default\u00a0<code>GITHUB_TOKEN<\/code>\u00a0permissions<\/li>\n\n\n\n<li>Whether organization secrets are broader than necessary<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Do not change production settings in a training exercise.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">37. Lab Step 6 \u2014 Verify Through CLI<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> ORG=<span class=\"hljs-string\">\"acme-engineering\"<\/span>\n\ngh auth status\ngh api <span class=\"hljs-string\">\"\/orgs\/$ORG\"<\/span>\ngh api --paginate <span class=\"hljs-string\">\"\/orgs\/$ORG\/teams\"<\/span>\ngh api <span class=\"hljs-string\">\"\/orgs\/$ORG\/actions\/permissions\"<\/span>\ngh api <span class=\"hljs-string\">\"\/orgs\/$ORG\/properties\/schema\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Expected outcome<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You should now be able to explain this chain:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">User\n -&gt; Team\n -&gt; Repository role\n -&gt; Custom property\n -&gt; Ruleset\n -&gt; Actions policy\n -&gt; Audit\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">That chain is the core of GitHub Organization Administration.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5-Minute Review<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">38. The Seven Rules to Remember<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Rule 1 \u2014 Keep Owners Rare<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use multiple owners for continuity, but do not turn owner into the normal admin role.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rule 2 \u2014 Prefer Teams Over Direct User Grants<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Team membership is easier to onboard, review, and revoke.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rule 3 \u2014 Use the Lowest Repository Role That Works<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Do not grant&nbsp;<code>Admin<\/code>&nbsp;when&nbsp;<code>Write<\/code>&nbsp;or&nbsp;<code>Maintain<\/code>&nbsp;is sufficient.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rule 4 \u2014 Centralize Policy with Rulesets<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Repository-by-repository configuration creates drift.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rule 5 \u2014 Classify Repositories with Custom Properties<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Metadata such as owner, tier, and classification lets policy scale dynamically.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rule 6 \u2014 Treat Actions as Privileged Automation<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Control actions, token permissions, runners, secrets, and cloud access.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rule 7 \u2014 Audit High-Risk Changes<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">An organization should be able to answer who changed access, policy, repositories, and integrations.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">39. Common Anti-Patterns<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Anti-pattern<\/th><th class=\"has-text-align-left\" data-align=\"left\">Why it is a problem<\/th><th class=\"has-text-align-left\" data-align=\"left\">Better approach<\/th><\/tr><\/thead><tbody><tr><td>Too many owners<\/td><td>Large blast radius<\/td><td>Delegated roles<\/td><\/tr><tr><td>Direct access everywhere<\/td><td>Hard to review\/remove<\/td><td>Teams<\/td><\/tr><tr><td>Admin for every developer<\/td><td>Unnecessary destructive capability<\/td><td>Write \/ Maintain<\/td><\/tr><tr><td>Uncontrolled public repositories<\/td><td>Data exposure risk<\/td><td>Creation and visibility policy<\/td><\/tr><tr><td>Branch settings configured manually in every repo<\/td><td>Configuration drift<\/td><td>Organization rulesets<\/td><\/tr><tr><td>No repository ownership metadata<\/td><td>No accountable team<\/td><td><code>owner_team<\/code>&nbsp;custom property<\/td><\/tr><tr><td>Unrestricted third-party Actions<\/td><td>Supply-chain exposure<\/td><td>Approved \/ allowlisted actions<\/td><\/tr><tr><td>Broad&nbsp;<code>GITHUB_TOKEN<\/code><\/td><td>Workflow compromise gains more power<\/td><td>Read-oriented default + explicit permissions<\/td><\/tr><tr><td>Shared owner PAT in automation<\/td><td>Poor auditability and excessive privilege<\/td><td>GitHub App<\/td><\/tr><tr><td>Long-lived cloud credentials<\/td><td>Credential leakage\/rotation burden<\/td><td>OIDC<\/td><\/tr><tr><td>Sensitive persistent runner for untrusted code<\/td><td>Network\/credential exposure<\/td><td>Isolated or ephemeral runners<\/td><\/tr><tr><td>No audit review<\/td><td>Suspicious changes are hard to explain<\/td><td>Audit process<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">40. Troubleshooting Essentials<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Problem<\/th><th class=\"has-text-align-left\" data-align=\"left\">First thing to check<\/th><\/tr><\/thead><tbody><tr><td>Member cannot access repository<\/td><td>Team membership and repository role<\/td><\/tr><tr><td>User has too much access<\/td><td>Base permission, teams, direct grants, delegated roles<\/td><\/tr><tr><td>Ruleset does not apply<\/td><td>Ruleset target conditions and custom property values<\/td><\/tr><tr><td>Ruleset blocks unexpectedly<\/td><td>All matching organization\/repository rules<\/td><\/tr><tr><td>Required check never appears<\/td><td>Workflow trigger and exact check name<\/td><\/tr><tr><td>Actions workflow cannot run<\/td><td>Organization\/repository Actions policy<\/td><\/tr><tr><td>GitHub API returns permission denied<\/td><td><code>GITHUB_TOKEN<\/code>&nbsp;or token permissions<\/td><\/tr><tr><td>Organization secret unavailable<\/td><td>Secret repository visibility\/scope<\/td><\/tr><tr><td>Job stays queued<\/td><td>Runner label, group access, online capacity<\/td><\/tr><tr><td>GitHub App gets 403<\/td><td>App permissions and installation repository scope<\/td><\/tr><tr><td>Setting changed unexpectedly<\/td><td>Audit log and other automation\/IaC owners<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">41. Quick Reference Cheat Sheet<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Main administration locations<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Need<\/th><th class=\"has-text-align-left\" data-align=\"left\">Common organization area<\/th><\/tr><\/thead><tbody><tr><td>Members and owners<\/td><td>People<\/td><\/tr><tr><td>Teams<\/td><td>Teams<\/td><\/tr><tr><td>Repository inventory<\/td><td>Repositories<\/td><\/tr><tr><td>Organization settings<\/td><td>Settings<\/td><\/tr><tr><td>Repository permissions<\/td><td>People \/ Teams \/ Repository access<\/td><\/tr><tr><td>Rulesets<\/td><td>Repository \/ Rules \/ Rulesets settings<\/td><\/tr><tr><td>Custom properties<\/td><td>Repository custom properties<\/td><\/tr><tr><td>Actions policy<\/td><td>Actions settings<\/td><\/tr><tr><td>Runners<\/td><td>Actions -&gt; Runners \/ Runner groups<\/td><\/tr><tr><td>Secrets and variables<\/td><td>Secrets and variables<\/td><\/tr><tr><td>GitHub Apps \/ OAuth \/ PAT policy<\/td><td>Third-party access \/ Developer settings<\/td><\/tr><tr><td>Authentication<\/td><td>Authentication security<\/td><\/tr><tr><td>Audit<\/td><td>Audit log \/ Logs<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub&#8217;s navigation changes over time, so learn the&nbsp;<strong>concept names<\/strong>, not only the exact sidebar position.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Repository roles<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Read     -&gt; consume and discuss\nTriage   -&gt; manage issues\/PRs without code write\nWrite    -&gt; normal development\nMaintain -&gt; repository operations\nAdmin    -&gt; full repository administration\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Essential CLI commands<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span># Authentication<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span>\ngh auth status\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span># Organization metadata<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span>\ngh api \"\/orgs\/$ORG\"\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span># Members<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span>\ngh api --paginate \"\/orgs\/$ORG\/members\"\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span># Teams<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span>\ngh api --paginate \"\/orgs\/$ORG\/teams\"\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span># Actions policy<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span>\ngh api \"\/orgs\/$ORG\/actions\/permissions\"\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span># Custom properties<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span>\ngh api \"\/orgs\/$ORG\/properties\/schema\"\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span># Audit log<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span>\ngh api --paginate \"\/orgs\/$ORG\/audit-log\"\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">42. Knowledge Check<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Why is a GitHub Organization not normally a login account?<\/li>\n\n\n\n<li>Why should an organization have more than one owner but still keep owner access rare?<\/li>\n\n\n\n<li>What is the difference between a member and an outside collaborator?<\/li>\n\n\n\n<li>Why are teams better than repeated direct repository permissions?<\/li>\n\n\n\n<li>What is the difference between Write, Maintain, and Admin?<\/li>\n\n\n\n<li>What does base repository permission do?<\/li>\n\n\n\n<li>Why should public repository creation usually be governed?<\/li>\n\n\n\n<li>Why are organization rulesets more scalable than configuring branch protection manually in every repository?<\/li>\n\n\n\n<li>How can a\u00a0<code>service_tier<\/code>\u00a0custom property drive policy?<\/li>\n\n\n\n<li>Why should default\u00a0<code>GITHUB_TOKEN<\/code>\u00a0permissions be conservative?<\/li>\n\n\n\n<li>What problem do runner groups solve?<\/li>\n\n\n\n<li>Why should organization secrets be scoped to selected repositories when possible?<\/li>\n\n\n\n<li>Why is OIDC usually preferable to long-lived cloud credentials?<\/li>\n\n\n\n<li>Why is a GitHub App usually preferable to an owner&#8217;s PAT for service automation?<\/li>\n\n\n\n<li>When would you use the organization audit log?<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Fast answers<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Users normally authenticate with personal or enterprise-managed identities; the organization is the shared resource\/governance boundary.<\/li>\n\n\n\n<li>Multiple owners provide continuity; too many owners increase administrative blast radius.<\/li>\n\n\n\n<li>A member belongs to the organization; an outside collaborator normally receives access only to selected repositories.<\/li>\n\n\n\n<li>Teams centralize access lifecycle and are easier to audit.<\/li>\n\n\n\n<li>Write supports normal development, Maintain adds repository operations, and Admin provides full repository administration.<\/li>\n\n\n\n<li>It establishes default repository access for organization members.<\/li>\n\n\n\n<li>Public creation can unintentionally expose company information or code.<\/li>\n\n\n\n<li>Rulesets provide centralized, reusable, targetable policy and reduce drift.<\/li>\n\n\n\n<li>A ruleset can target all repositories whose\u00a0<code>service_tier<\/code>\u00a0equals a chosen value.<\/li>\n\n\n\n<li>A compromised workflow should not automatically receive write authority.<\/li>\n\n\n\n<li>They control which repositories\/workflows can use particular runners and help create trust boundaries.<\/li>\n\n\n\n<li>Broad secrets create a broad blast radius.<\/li>\n\n\n\n<li>OIDC provides short-lived cloud credentials with claim-based trust instead of copying permanent keys.<\/li>\n\n\n\n<li>GitHub Apps support granular permissions, selected repositories, and short-lived installation tokens.<\/li>\n\n\n\n<li>To investigate and verify administrative and access changes.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">43. What to Learn Next<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">After mastering this two-hour Essentials guide, continue in this order:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Security configurations, Dependabot, code scanning, secret scanning, and push protection<\/li>\n\n\n\n<li>SAML SSO and SCIM<\/li>\n\n\n\n<li>GitHub Apps and webhook design<\/li>\n\n\n\n<li>Advanced Actions runner governance and OIDC trust design<\/li>\n\n\n\n<li>Billing, usage, and cost controls<\/li>\n\n\n\n<li>REST API, GraphQL, and\u00a0<code>gh api<\/code><\/li>\n\n\n\n<li>Terraform for GitHub organization configuration<\/li>\n\n\n\n<li>Audit export \/ SIEM integration<\/li>\n\n\n\n<li>Organization migration and recovery<\/li>\n\n\n\n<li>Copilot, agent, MCP, and AI governance where used<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">44. Essential Production Baseline<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use this as the final classroom takeaway.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">GitHub Organization\n|\n|-- <span class=\"hljs-number\">2<\/span>+ trusted owners, small owner group\n|\n|-- People\n|   |-- Members\n|   |-- Outside collaborators only when appropriate\n|   <span class=\"hljs-string\">`-- Strong authentication\n|\n|-- Teams\n|   `<\/span>-- Normal repository access comes through teams\n|\n|-- Repository permissions\n|   |-- Conservative base permission\n|   |-- Least privilege roles\n|   <span class=\"hljs-string\">`-- Public \/ delete \/ transfer controls\n|\n|-- Repository governance\n|   |-- Custom properties\n|   |-- Organization rulesets\n|   `<\/span>-- Required PR and CI controls <span class=\"hljs-keyword\">for<\/span> important repos\n|\n|-- GitHub Actions\n|   |-- Controlled actions\n|   |-- Restricted GITHUB_TOKEN\n|   |-- Runner trust boundaries\n|   |-- Scoped secrets\n|   <span class=\"hljs-string\">`-- OIDC for cloud access\n|\n|-- Programmatic access\n|   |-- GitHub Apps preferred\n|   |-- Fine-grained tokens when required\n|   `<\/span>-- No shared owner credentials\n|\n<span class=\"hljs-string\">`-- Audit\n    `<\/span>-- High-risk changes are reviewable and explainable\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If students understand this model, they understand the&nbsp;<strong>essential operating system of GitHub Organization Administration<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">45. Selected Official References<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use the full reference guide for the complete source list. The most important official documentation for this Essentials course includes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/docs.github.com\/en\/organizations\/collaborating-with-groups-in-organizations\/about-organizations\">About organizations<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.github.com\/en\/organizations\/managing-peoples-access-to-your-organization-with-roles\/roles-in-an-organization\">Roles in an organization<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.github.com\/en\/organizations\/managing-access-to-your-organizations-repositories\/repository-roles-for-an-organization\">Repository roles for an organization<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.github.com\/en\/organizations\/managing-organization-settings\">Managing organization settings<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.github.com\/en\/organizations\/managing-organization-settings\/creating-rulesets-for-repositories-in-your-organization\">Creating rulesets for repositories in your organization<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.github.com\/en\/organizations\/managing-organization-settings\/managing-custom-properties-for-repositories-in-your-organization\">Managing custom properties for repositories<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.github.com\/en\/organizations\/managing-organization-settings\/disabling-or-limiting-github-actions-for-your-organization\">Disabling or limiting GitHub Actions for your organization<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.github.com\/en\/actions\/how-tos\/manage-runners\/self-hosted-runners\/manage-access\">Managing access to self-hosted runners using groups<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.github.com\/en\/organizations\/keeping-your-organization-secure\/managing-two-factor-authentication-for-your-organization\/requiring-two-factor-authentication-in-your-organization\">Requiring two-factor authentication in your organization<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.github.com\/en\/organizations\/managing-programmatic-access-to-your-organization\/about-programmatic-access-in-your-organization\">About programmatic access in your organization<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.github.com\/en\/organizations\/keeping-your-organization-secure\/reviewing-the-audit-log-for-your-organization\">Reviewing the audit log for your organization<\/a><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">End of 2-Hour Essentials Tutorial<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Recommended training principle:<\/strong>&nbsp;teach the access and governance model first. Introduce advanced settings only after students can explain how a user gains repository access, how policy constrains that access, how workflows receive authority, and how administrators verify changes.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Last Verified:&nbsp;September 2026Based on:&nbsp;GitHub Organization Administration \u2014 Complete Reference Guide and TutorialDuration:&nbsp;2 hoursAudience:&nbsp;GitHub organization owners, DevOps\/platform engineers, developers with delegated administration duties, security administrators, and technical trainers&#8230;. <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-78750","post","type-post","status-publish","format-standard","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/78750","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=78750"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/78750\/revisions"}],"predecessor-version":[{"id":78751,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/78750\/revisions\/78751"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=78750"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=78750"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=78750"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}