Wat is DevSecOps?
DevSecOps is bovenal een bedrijfscultuur filosofie. Het is een methodiek waarmee je tegelijkertijd operational excellence en structurele efficiëntie kunt bereiken. DevSecOps biedt grote voordelen voor organisaties:
- Verhoogde snelheid voor teams
- Snellere en frequentere leveringen
- Applicatie- en implementatiebetrouwbaarheid
- Samenwerking tussen belanghebbenden en verbeterde schaalbaarheid
- Beveiliging
Wat is infrastructuur als code?
In de meeste gevallen maakt de cloud het mogelijk om een infrastructuur en het fysieke beheer daarvan weg te laten. De infrastructuur bestaat echter nog steeds. Het past zich eenvoudig aan de nieuwe methoden en vereisten van de teams aan. Een migratie naar de cloud maakt uw Ops-teams dus niet overbodig.
De opkomst van Infrastructure as Code (IaC) stelt u in feite in staat om alle spelers in het IT-ecosysteem van uw organisatie beter van dienst te zijn. Deze benadering, vaak de kern van DevOps-transformatie, is niet alleen een toegevoegde waarde, maar een echte noodzaak.
Naast een reorganisatie om deze paradigmaverschuiving mogelijk te maken, is een aantal tools en services (vaak geassocieerd met bepaalde DevSecOps-praktijken) nodig voor:
- Continuous integration (CI)
- Continuous delivery (CD)
- IaC
- Monitoring
- Collaboration
Tools, die vaak worden beschouwd als eenvoudige handelswaar, zijn nu essentieel voor de implementatie van DevSecOps in organisaties. We moeten daarom even de tijd nemen om de verschillende aanbiedingen op de markt te verkennen en te begrijpen hoe deze producten samenwerken in uw ecosysteem.
Hoe voldoen AWS-tools aan de eisen van DevSecOps?
Laten we eens kijken naar de tools die AWS biedt voor het creëren van een relevante en effectieve DevSecOps-stack.
AWS-tools voor continue integratie (CI)
Continue integratie omvat de automatisering van de bouw-, test- en leveringsfasen. Het geeft ontwikkelaars de zekerheid dat ze een solide basis hebben voor elk nieuw project.
- CodeCommit is de eerste schakel in de keten, waar de code wordt opgeslagen.
- CodeBuild implementeert de build-, test- en deliverable-generatiefasen. Het kan bijvoorbeeld bij elke commit in CodeCommit worden gestart.
- CodeArtifact is een opslagplaats voor artefacten. Het kan worden gebruikt om CodeBuild-resultaten op te slaan voor projecten zoals een bibliotheek. Laten we zeggen dat de ontwikkelaars van een ander project deze bibliotheek nodig hebben om up-to-date te zijn om verder te gaan met hun project. Een verwijzing naar de artefactrepository is dan beschikbaar in hun hulpprogramma’s voor afhankelijkheidsbeheer.
- Elastic Container Registry (ECR) is een Docker-imageregister. Het kan op dezelfde manier worden gebruikt als CodeArtifact, ervan uitgaande dat CodeBuild een of meer Docker-afbeeldingen heeft gegenereerd en dat deze afbeeldingen nuttig zijn voor andere projecten of voor de leveringsfase.
AWS-tools voor continue levering (CD)
Continuous delivery omvat de automatisering van de implementatiefasen, met uitzondering van productie-implementatie (die handmatig wordt gedaan).
- CodeDeploy maakt het mogelijk om een applicatie te implementeren of te updaten op AWS of on-premise servers.
- CodePipeline fungeert als de link tussen CI en CD. Een pijplijn definieert een werkstroom die kan beginnen met de commit en zich kan uitstrekken tot aan de implementatie:
Welke AWS-tools kunnen worden gebruikt voor Infrastructure as Code?
- CDK (Cloud Development Kit) kan worden gebruikt om de infrastructuur (die uw project zal uitvoeren) als code in te stellen. Compatibel met JavaScript, TypeScript, Python, Java, C# en Go (in Developer Preview), transformeert het uw favoriete programmeertaal in een AWS-configuratie beheerd door CloudFormation.
- CloudFormation kan direct worden gebruikt om de instantiëring van resources in AWS te automatiseren.
Laten we eens kijken naar een eenvoudig voorbeeld in TypeScript. We maken een door AWS beheerd geheim dat alleen kan worden gelezen door een gedefinieerde IAM-rol.
Allereerst biedt AWS ons een Stack-interface om ons te helpen onze AWS-infrastructuur te definiëren:
export class InfraStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); // definition of the infrastructure here } }
Alle volgende codeblokken worden in “definitie van de infrastructuur hier” geplaatst.
Laten we de IAM-rol aanmaken:
const secretRole = new iam.Role(this, 'MyRole', { assumedBy: new iam.AnyPrincipal() });
Dit wordt opgeslagen in de variabele secretRole, die voor de rest van de code kan worden gebruikt.
“MyRole” wordt gebruikt om de naam te definiëren die zal worden gevonden in CloudFormation.
Met “assumedBy” kunt u beperken wie de rol op zich kan nemen. Misschien wilt u dat de rol wordt overgenomen door een WebIdentityPrincipal, zoals een gefedereerde webidentiteit die wordt geleverd door Facebook, Google, Cognito, enz., een ServicePrincipal zoals Lambda of EC2, of een CanonicalUserPrincipal (een AWS-gebruiker), enz.
Nu we de rol hebben, gaan we het geheim maken:
const websiteAccessPassword = new sm.Secret(this, "WebsiteAccessPassword", { generateSecretString: { secretStringTemplate: "{}", generateStringKey: "password" } });
Eerst initialiseren we het geheim “WebsiteAccessPassword” in CloudFormation. Met deze initialisatie genereert AWS een tekenreeks die overeenkomt met het wachtwoord in het geheim.
“generateStringKey” genereert de tekenreeks in “password” en de “password”-sleutel is te vinden in het lege JSON-object “{}” geleverd door “secretStringTemplate.”
Met andere woorden, wanneer we het geheim ophalen (bijvoorbeeld met de CLI-opdracht “aws secretsmanager get-secret-value”), geeft het ons een JSON-object zoals dit:
{ “password”: “leSecretGénéré” }
Ten slotte moeten we onze rol toestemming geven om ons geheim te lezen:
websiteAccessPassword.grantRead(secretRole);
Bonus:
We kunnen deze rol toevoegen aan elke resource die we hebben gemaakt. We willen bijvoorbeeld toegang tot het geheim van een EC2-instantie die we ook via CDK hebben gemaakt (of waarnaar we hebben verwezen). Nu hoef je het alleen nog maar de rol “secretRole:” te geven.
const ec2Instance = new ec2.Instance(this, "ec2-instance", { “role”: secretRole, ... });
Om af te sluiten met CDK, volstaat een enkele opdracht om onze code om te zetten in CloudFormation-infrastructuur: “cdk deploy”
Net als alle broncodes kan IaC worden beheerd met continue integratie en levering. We kunnen dan een hele infrastructuur inzetten op dezelfde manier als we zouden doen met de programma’s die op dezelfde infrastructuur zullen draaien.
In dit eerste artikel presenteerden we de AWS-tools voor de levering, continue implementatie en creatie van Infrastructure as Code. Deze eerste stenen vormen de basis van uw AWS-infrastructuur. Om echter zo dicht mogelijk bij de DevSecOps-methodiek te blijven en een consistente stack te verkrijgen, zijn extra bouwstenen nodig: met name monitoring en samenwerking. Deze komen in volgende artikelen aan bod. Ontdek ondertussen ons AWS-aanbod hier.