Pubblicato il 03/02/2024 da alnao nella categoria AWS

Il tema della sicurezza non deve mai essere sottovalutato, in particolare quando si lavora in un Cloud AWS è indispensabile prestare attenzione alle regole di accesso alle istanze Ec2 per evitare che qualcuno di non autorizzato acceda alle istanze e faccia danni o rubi informazioni. In particolare, in AWS, per Security Group si intende il sotto-servizio per la definizione delle regole di accesso alle macchine Ec2: di default tutte le interfacce di rete sono bloccate sia in ingresso sia in uscita ma grazie ai Security Group (spesso indicati con la sigla SG) è possibile abilitare porte di rete in ingresso e in uscita. Si rimanda sempre alla documentazione ufficiale per tutti i dettagli riguardo a questo servizio. Il servizio era inizialmente studiato solo per le istanze E22 ma oggi è usato per gestire le regole di rete anche di altri servizi come RDS e ALB, si tuttavia il SG è un sottoservizio del servio Ec2. Purtroppo spesso in lingua italiana il nome di questo servizio viene tradotto con gruppo di sicurezza, questa traduzione spesso può creare confusione quindi è consigliato usare sempre la lingua inglese per evitare fraintendimenti.

Le regole definite con SG sono di due tipi: in ingresso (incoming) e in uscita (outgoing), tipicamente si autorizza tutto il traffico in uscite mentre è importate limitare le regole in ingresso solo ai protocolli, alle porte e agli IP indispensabili. Si rimanda alla documentazione ufficiale per maggior informazioni riguardo alla procedura guidata via web.


La CLI mette a disposizione una serie di comandi per la gestione dei SecurityGroup, si rimanda alla documentazione ufficiale e alla guida per tutti i dettagli. I principali comandi sono:

  • elenco delle regole e il dettaglio di uno specifico
    aws ec2 describe-security-groups 
    aws ec2 describe-security-groups --group-ids sg-903004f8
  • creazione di un nuovo security group
    aws ec2 create-security-group --group-name my-sg --description "My security group" --vpc-id vpc-xxxx
  • aggiunta, rimozione emodifica di una regola all’interno del security group
    aws ec2 authorize-security-group-ingress --group-id sg-903004f8 --protocol tcp --port 3389 --cidr x.x.x.x/x
    aws ec2 authorize-security-group-ingress --group-id sg-903004f8 --protocol tcp --port 22 --cidr x.x.x.x/x
    aws ec2 modify-security-group-rules ...
    aws ec2 revoke-security-group-ingress ..
  • modifica di una reola con tutti i dettagli
    aws ec2 modify-security-group-rules --group-id sg-1234567890abcdef0 --security-group-rules SecurityGroupRuleId=sgr-abcdef01234567890,SecurityGroupRule='{Description=test,IpProtocol=-1,CidrIpv4=0.0.0.0/0}'
  • cancellazione di un security group
    aws ec2 delete-security-group --group-id sg-903004f8

La libreria boto3 del SDK mette a disposizione molti metodi per la gestione dei security group, si rimanda alla documentazione ufficiale per tutti i dettagli, il principale metodo è quello per recuperare l’elenco completo delle regole:

ec2_client = boto3.client('ec2')
response = ec2_client.describe_security_groups()

Si rimanda alla documentazione ufficiale per esempi in altri linguaggi di programmazione come java.


Con CloudFormation è possibile definire regole con il tipo specifico dedicato:

InstanceSecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: Enable SSH access via port 22
    VpcId: !Ref 'VpcId'
    SecurityGroupIngress:
    - IpProtocol: TCP
      FromPort: 22
      ToPort: 22
      CidrIp: !Ref 'SSHLocation'
    - CidrIp: '0.0.0.0/0'
      IpProtocol: TCP
      FromPort: 80
      ToPort: 80

E nella definizione delle istanze è possibile collegare una EC2 ad uno o più gruppi con la definizione delle istanze:

EC2Instance:
  Type: AWS::EC2::Instance
  Properties:
    InstanceType: !Ref 'InstanceType'
    KeyName: !Ref 'KeyName'
    ImageId: !Ref 'LatestAmiId'
    NetworkInterfaces: 
    - GroupSet: [!Ref 'InstanceSecurityGroup']
      SubnetId: !Ref SubnetId
      AssociatePublicIpAddress: true
    DeviceIndex: '0'
    DeleteOnTermination: true

Nella definizione di un security group è possibile definire nell’input come sorgente l’output di un altro security group, per esempio il traffico di un ALB verso un WebServer può essere regolato con la definizione:

ALBSecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: Load balancer traffic
    SecurityGroupIngress:
    - IpProtocol: TCP
      FromPort: '80'
      ToPort: '80'
      CidrIp: 0.0.0.0/0
    VpcId: !Ref VpcId 
WebServerSecurityGroup:
  Type: 'AWS::EC2::SecurityGroup'
  Properties:
    GroupDescription: Enable HTTP access via port 80 locked down to the load balancer + SSH access
    SecurityGroupIngress:
    - IpProtocol: TCP
      From Port: '80'
      ToPort: '80'
      SourceSecurityGroupId: !Ref ALBSecurityGroup

Da notare che in tutti i punti è indispensabile indicare sempre la VPC dove la regola deve essere definita. Si rimanda i vari esempi presenti al solito repository

https://github.com/alnao/AWSCloudFormationExamples

Per il collegamento dei Security Group alle istanze EC2 esistono diversi modi ma il principale per le istanze GNU Linux rimane il protocollo SSH (secure shell h), questo viene configurato di default nelle istanze AMI standard di tipo GNU Linux, per il collegamento è sempre necessario usare una chiave privata in formato PEM configurabile nel sotto-servizio Key Pairs previsto dal servizio Ec2, si rimanda alla documentazione ufficiale per i dettagli di questo servizio. La o le chiavi devono essere agganciate alle istanze Ec2, questa associazione può essere effettuata da console, da SDK o anche da CloudFormation con la proprietà specifica

KeyName: !Ref 'KeyName'

Nella regola del security group è necessario configurare la porta 22, senza questa regola la porta di rete rimarrebbe chiusa e il collegamento non potrebbe avvenire

SecurityGroupIngress:
- IpProtocol: tcp
  FromPort: 22
  ToPort: 22
  CidrIp: !Ref 'SSHLocation'

Per il collegamento alla istanza è possibile un qualunque programma shell e/o bash, come un terminale GNU Linux o Putty per Windows.

ssh utente@indirizzoip -i key_privata.pem

Da notare che le chiavi pubbliche abilitate al collegamento vengono salvate nelle istanze nel file:

.ssh/authorized_keys

della utenza principale (bitnami nel caso di AMI di quel tipo o ec2_user nel caso di istanze di tipo Amazon Linux).


Per le istanze Windows, è possibile abilitare la connessione tramite desktop remoto abilitando il protocollo RDP (remote desktop protocol), per le istanze con questo sistema operativo non è possibile usare una chiave privata ma bisogna usare le credenziali con username e password. L’abilitazione del protocollo RDP è molto semplice: basta infatti abilitare la porta 3389 nel protocollo TCP, si rimanda alla documentazione ufficiale per maggiori informazioni.

Nota: è sempre sconsigliato utilizzare la Cidr di tipo 0.0.0.0/0 tranne per quelle connessioni aperte verso tutta la rete internet, in particolare per l’accesso con i protocolli SSH e/o RDP è consigliato impostare un Ip fisso o un range molto più ristretto.

MENU