Etter å ha sett hvordan kunder håndterer repoer, gir de ut Repoman gratis

Usikre repoer på GitHub er en gjenganger, ifølge Karim EL-Melhaoui i O3 Cyber, og gir bort verktøy for å gjøre det enklere.

Repoman er et verktøy for å administrere Github-repoer, og ble opprinnelig laget for å løse et problem for en kunde. 📸: O3 Cyber
Repoman er et verktøy for å administrere Github-repoer, og ble opprinnelig laget for å løse et problem for en kunde. 📸: O3 Cyber Vis mer

Mange bedrifter tar i bruk konsepter som infrastruktur som kode og integrerer dette med CI/CD gjennom GitHub og andre løsninger for versjonskontroll og samarbeid om kildekode.

Dette er ikke alltid problemfritt om man ikke gjør det på riktig måte, sier Karim EL-Melhaoui, Principal i det norske sikkerhetsselskapet O3 Cyber.

– En gjenganger er mangel på beskyttelse, sier El-Melhaoui til kode24.

Han snakker ofte med selskaper som jobber med sky, enten ved å gå gjennom en leveranse eller som en del av et team. Ofte forteller de at de bruker infrastruktur som kode og hevder at alt skal være sikkert, fordi det er sjekket inn i et "repository" i for eksempel GitHub.

– Når jeg graver nærmere i hvordan dette er konfigurert, finner jeg som regel ut at det er flere administratorer som kan overstyre regelsettet som forhindrer alle fra å benytte en privilegert servicekonto, eller at man på andre måter kan rulle ut kode til kritiske infrastruktur-komponenter uten at den må gjennomgå Peer Review.

Nå har O3 Cyber utviklet et nytt verktøy som skal gjøre det enklere for bedrifter å sikre GitHub, som er det kildekodesystemet de oftest ser kundene bruker.

Nytt gratisverktøy

Verktøyet kalles Repoman og ligger gratis tilgjengelig på GitHub.

Med Repoman skal det bli enklere å konfigurere GitHub sikkert, og provisjonere nye repoer med grunnleggende sikkerhet satt som standard. Og det uten at man behøver å ha flere administratorer enn nødvendig.

from package.repoclient import GithubRepoClient

# Instantiate the client
client = GithubRepoClient('your-github-token')

# Create a repository
client.create_repos('your-org-or-user', [{'repo_name': 'name-of-repository'}])

– Hvordan kom dere på å lage dette verktøyet?

– Verktøyet ble opprinnelig laget av oss for å løse problemet med å sette opp GitHub fra bunn hos en kunde. GitHub skulle være en kritisk komponent for Continuous Integration til skyplattformen og måtte derfor være konfigurert sikkert, forklarer El-Melhaoui.

– Etter å ha avsluttet engasjementet med kunden kom vi frem til at dette hadde vært nyttig flere steder, så vi skrev prosjektet i en ny og forbedret utgave.

Grunnleggende sikkerhet

– Hvordan bruker man Repoman i praksis?

– Tanken er at man kan bruke Repoman med for eksempel en GitHub Actions Workflow, hvor man kan ha konfigurasjonen i en JSON-fil i samme repository. Så rulles konfigurasjonen ut når noen godkjenner en pull request, eller man kan gjøre det mer avansert og ha dataene i en database.

Du kan for eksempel beskrive hvordan ulike repoer skal opprettes og konfigureres gjennom et array med objekter:

repositories = [
    {
        "repo_name": "company-project",
        "description": "This is a configuration repository",
        "repo_secrets": [
            {"secret_name": "SECRET1", "secret_value": "value1"},
            {"secret_name": "SECRET2", "secret_value": "value2"}
        ]
    },
    {
        "repo_name": "test-automation",
        "description": "This is a test automation repository",
        "environments": [
            {"environment_name": "production", "protected_branches_only": True}
        ]
    },
    {
        "repo_name": "no-init-no-branchprotection",
        "description": "This is a no init to branch protection repository",
        "branch_protection": False,
        "auto_init": False
    }
]

Det er også mulig å bruke verktøyet lokalt.

– Tanken er å gi mest mulig portabilitet. GithubSecretsClient kan brukes fra hvor som helst for å kryptere et passord før det lastes opp til GitHub. Tanken med verktøyet er at det skal være portabelt og kunne støtte de fleste use cases.

from package.secretsclient import GithubSecretsClient

# Instantiate the client
client = GithubSecretsClient('your_github_token', 'org_or_user')

# Add a secret to a repository
client.add_secrets('repo_name', 'secret_name', 'secret_value')

– De eksisterende løsningene som dekker behovene vi har identifisert, har ofte for høy terskel for å bli implementert. Dette er grunnen til at vi har valgt å lage et superenkelt, lettvektsverktøy i Python som gir de kritiske funksjonene vi mener at alle organisasjoner bør ha.

– Ved å lage dette verktøyet ønsker vi å belyse problemstillingen og samtidig vise hvordan det kan løses i praksis uten å være for komplisert.

Manglende backup

El-Melhaoui forteller at de også hadde behov for å ta sikkerhetskopi av løsningen de bygde for en kunde da den var essensiell for "Disaster Recovery" av skyplattformen.

Etter å ha avsluttet engasjementet med kunden, fant de ut at dette kunne være nyttig også i andre sammenhenger. El-Melhoui sier mange bedrifter kjøper GitHub som SaaS, uten å tenke på at det som ligger der bør sikkerhetskopieres.

– Til tross for at det er en SaaS-løsning, kan et enkelt angrep føre til at all kildekode slettes. Kildekoden blir ofte referert til i katastrofehåndteringsplaner, uten at man nødvendigvis tenker på backup av systemet.

Repoman har derfor en pakke som heter GithubBackupClientAzure som kan brukes for å sikkerhetskopiere en GitHub-organisasjon til Azure.

– Denne ble inkludert litt som følge av min egen dårlige samvittighet. Alle gangene jeg har lovet å skru på backup av GitHub og utsatt dette fordi jeg ikke har hatt en ide om hvor enkelt det kan gjøres. Her er jeg ikke alene om å føle skyld! sier El-Melhaoui.