Limber Villca Condori
Limber Villca Condori
Limber Villca Condori
Automatización de redes
“Trabajo final Proyecto CloudFormation ”
:
Nombre :Limber Villca Condori
Materia: Diplomado en Automatización avanzada de redes de comunicación
Fecha: 2/07/2023
pág. 1
Tabla de contenido
1. Introducción................................................................................................................. 2
2. Desarrollo ...................................................................................................................... 5
2.1. Creación de la VPC ............................................................................................... 5
2.2. Creación de las Subnet .......................................................................................... 6
2.3. Creación de las dos EC2........................................................................................ 7
2.4. Creación del grupo de seguridad ........................................................................... 9
2.5. Creación de la condición ..................................................................................... 10
2.6. Creación de la llaves para el acceso remoto por SSH ......................................... 11
2.6.1. Host bastion ................................................................................................. 11
2.6.2. Llaves en la instancia privada ..................................................................... 12
3. Demostración del funcionamiento de la plantilla ........................................................ 12
3.1. Listado de los recursos creados ........................................................................... 13
3.2. Conexión al host Bastión por ssh (consola) ........................................................ 16
3.3. Conexión al ec2 Privada ...................................................................................... 16
4. Conclusiones ............................................................................................................... 17
1. Introducción
Infraestructura con Bastión Host utilizando AWS CloudFormation
Antecedentes:
En el ámbito de la infraestructura de la nube, AWS CloudFormation es una
herramienta poderosa que permite automatizar la creación ygestión de recursos en AWS
de manera consistente y repetible. Mediante el uso de plantillas, es posible definir la
configuración deseada dela infraestructura y AWS CloudFormation se encargará de
crear y configurar los recursos de forma automatizada.
En este trabajo, se busca desarrollar un Stack en AWS CloudFormation que
implemente una infraestructura simple con un Bastión host. ElBastión host será
utilizado como punto de entrada seguro para acceder a instancias EC2 privadas dentro
de una VPC.
El diagrama de una estructura con Bastión Host se lo presenta a continuación. Este
diagrama fue explicado en el curso.
pág. 2
Instrucciones:
Diseño de la infraestructura:
Diseñe la infraestructura que constará de una Subred Pública, una Subred Privada,
una instancia EC2 que actuará como el Bastión host y una instancia que se ubicara en la
Subred Privada.
La Subred Pública será utilizada para el Bastión host, mientras que la Subred
Privada albergará la instancia EC2 privada a la que se accederá a través del Bastión
host.
Defina la configuración de seguridad adecuada para el Bastión host, como el grupo
de seguridad que permitirá el acceso SSH (puerto 22) desde direcciones IP
seleccionadas, así como el grupo de seguridad de la instancia EC2 privada a la cual se
deberá poder acceder a través del Bastión Host por el puerto 22.
Creación del Template de AWS CloudFormation:
Prepare un archivo YAML o JSON que represente el Template de AWS
CloudFormation para crear la infraestructura. Utilice la estructura adecuada de
CloudFormation y asegúrese de incluir todos los recursos necesarios para las Subredes,
el Bastión host, instancia de prueba y otros necesarios.
Defina los parámetros necesarios en el Template para permitir la personalización de
la infraestructura, como el CIDR de las Subredes, nombres de las subredes, la AMI a
utilizar para el Bastión host, etc.
Debe utilizar la mayoría de las funciones intrínsecas explicadas en el curso.
Debe utilizar Mappings para la selección de las AMI de las instancias EC2.
También debe utilizar Conditions para demostrar el uso de esta característica de
Cloudformation.
Creación de la VPC y Subredes:
pág. 3
Implemente el Stack de AWS CloudFormation en la región de elección del usuario.
Debe dar a elegir 2 opciones (por ejemplo, us-east-1, us-east-2).
Verifique que las subredes (pública y privada) se hayan creado correctamente. Tome
nota de los rangos de red de las subredes creadas y añada capturas de pantalla de la
consola de AWS que muestren las subredes.
Configuración del Bastión Host:
Conéctese al Bastión host.
Verifique que el Bastión host tenga conectividad a Internet y pueda acceder a los
servicios de AWS.
Acceso a Instancias EC2 Privadas:
Implemente una instancia EC2 en la subred privada creada anteriormente.
Asegúrese de que esta instancia no tenga acceso a Internet directo.
Utilice el Bastión host para acceder a la instancia EC2 privada utilizando SSH.
Verifique que el acceso a la instancia EC2 privada desde el Bastión host sea
exitoso.
Eliminación de recursos:
Una vez que haya completado todas las verificaciones, elimine todos los recursos
creados (Subredes, Instancias EC2, etc.) para evitar incurrir en costos adicionales.
Formato de Entrega:
Un archivo YAML o JSON del Template de AWS CloudFormation desarrollado.
Capturas de pantalla que incluyan los rangos de red de las subredes creadas,
información de los recursos de la VPC y el acceso exitoso al Bastión host y la instancia
EC2 privada.
Un informe detallado que incluya una descripción de la infraestructura creada, los
pasos seguidos para su implementación, los desafíos enfrentados y cómo se resolvieron,
y las conclusiones obtenidas.
Nota:
Asegúrese de seguir las mejores prácticas de seguridad al configurar el Bastión host
y controlar el acceso a las instancias EC2 privadas. Además, no olvide eliminar todos
los recursos una vez completadas las pruebas para evitar incurrir en cargos adicionales.
El template recibido como trabajo será utilizado para replicar la solución desarrollada y
explicada en el informe.
pág. 4
2. Desarrollo
parameters.
VpcCidr:
Type: String
Default: 10.0.170.0/24
Description: Direccion de red para la VPC
AllowedPattern: "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})"
ConstraintDescription: Debe ser una CIDR valida ( Ej. 10.0.50.0/24)
Resources.
#creacion de la vpc
myVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VpcCidr
EnableDnsSupport: 'true'
EnableDnsHostnames: 'true'
Tags:
- Key: stack
Value: desarrollo
InternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}
VPCGatewayAttachment:
Type: AWS::EC2::VPCGatewayAttachment
pág. 5
Properties:
InternetGatewayId: !Ref InternetGateway
VpcId: !Ref myVPC
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref myVPC
PublicSubnetsRoute:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
DependsOn: VPCGatewayAttachment
PublicSubnetRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet
RouteTableId: !Ref PublicRouteTable
PrivateRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref myVPC
PrivateSubnetsRoute:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref PrivateRouteTable
DestinationCidrBlock: 0.0.0.0/0
NatGatewayId: !Ref NatGateway
PrivateRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PrivateSubnet
RouteTableId: !Ref PrivateRouteTable
pág. 6
PublicSubnetCidr:
Type: String
Default: 10.0.170.0/25
Description: Direccion de red para la Subred Publica
AllowedPattern:
"(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})"
ConstraintDescription: Debe ser una CIDR valida ( Ej. 10.0.50.0/25)
PrivateSubnetCidr:
Type: String
Default: 10.0.170.128/25
Description: Direccion de red para la Subred Privada
AllowedPattern:
"(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})"
ConstraintDescription: Debe ser una CIDR valida ( Ej. 10.0.50.128/25)
Resources.
#------creacion de las dos subnet para la vpc---------------
PublicSubnet:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: !Select [0, !GetAZs ""]
CidrBlock: !Ref PublicSubnetCidr
MapPublicIpOnLaunch: true
VpcId: !Ref myVPC
Tags:
- Key: Name
Value: !Ref NombreSubredPublica
PrivateSubnet:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: !Select [1, !GetAZs ""]
CidrBlock: !Ref PrivateSubnetCidr
MapPublicIpOnLaunch: false
VpcId: !Ref myVPC
Tags:
- Key: Name
Value: !Ref NombreSubredPrivada
pág. 7
BastionInstanceType:
Type: String
Default: t2.micro
AllowedValues:
- t2.micro
- t2.nano
- t2.small
Description: Enter t2.micro, t2.nano, or t2.small. Default is
t2.micro.
BastionInstanceSO:
Type: String
Default: AmazonLinuxHVM64
AllowedValues:
- AmazonLinuxHVM64
- UbuntuLinuxHVM64
Description: Enter AmazonLinuxHVM64, or UbuntuLinuxHVM64. Default is
AmazonLinuxHVM64.
PrivateInstanceType:
Type: String
Default: t2.micro
AllowedValues:
- t2.micro
- t2.nano
- t2.small
Description: Enter t2.micro, t2.nano, or t2.small. Default is
t2.micro.
PrivateInstanceSO:
Type: String
Default: AmazonLinuxHVM64
AllowedValues:
- AmazonLinuxHVM64
- UbuntuLinuxHVM64
Description: Enter AmazonLinuxHVM64, or UbuntuLinuxHVM64. Default is
AmazonLinuxHVM64.
Resources.
#creacion de las 2 instacias de EC2
MyEC2InstancePublicBastion:
Type: "AWS::EC2::Instance"
Properties:
ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", !Ref
BastionInstanceSO]
InstanceType: !Ref BastionInstanceType
AvailabilityZone: !Select [0, !GetAZs ""]
pág. 8
KeyName: !Ref KeyNameBastion
SubnetId: !Ref PublicSubnet
SecurityGroupIds:
- Ref: PublicSecurityGroupSSH
MyEC2InstancePrivate:
Type: "AWS::EC2::Instance"
Properties:
ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", !Ref
PrivateInstanceSO]
InstanceType: !Ref PrivateInstanceType
AvailabilityZone: !Select [1, !GetAZs ""]
KeyName: !Ref KeyNameEC2
SubnetId: !Ref PrivateSubnet
SecurityGroupIds:
- Ref: PrivateSecurityGroupSSH
PrivateSecurityGroupSSH:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: "Permitir conexiones ssh"
VpcId: !Ref myVPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
pág. 9
ToPort: 22
CidrIp: 0.0.0.0/0
SecurityGroupEgress:
- IpProtocol: -1
FromPort: -1
ToPort: -1
CidrIp: 0.0.0.0/0
EipNat:
Type: AWS::EC2::EIP
Properties:
Domain: vpc
DependsOn: VPCGatewayAttachment
NatGateway:
Type: AWS::EC2::NatGateway
Properties:
AllocationId: !GetAtt EipNat.AllocationId
SubnetId: !Ref PublicSubnet
Conditions:
CreateProdResources: !Equals
pág. 10
- !Ref Montaje
- verdadero
Resources.
MountPoint:
Type: 'AWS::EC2::VolumeAttachment'
Condition: CreateProdResources
Properties:
InstanceId: !Ref MyEC2InstancePrivate
VolumeId: !Ref NewVolumeEBS
Device: /dev/sdh
NewVolumeEBS:
Type: 'AWS::EC2::Volume'
Condition: CreateProdResources
Properties:
Size: 8
AvailabilityZone: !Select [1, !GetAZs ""]
Para el acceso remoto (tanto al host bastion como al host EC2) se crearon dos llaves
respectivamente.
2.6.1. Host bastion
Llave en .pem
pág. 11
ZYiZwDUCgYA/uwApiTy5bqleWLfMr2BbAewhdn7L99F+qGsd8UC/XmnOCsb09LHh
TvmmHRppKLxI791TbljPwOBOrZGKgcqXdqIZuP943OGyjlV/6UNz5Sg5GZFtCLNu
6t+C5PA5xgFlTgMi/j+WZNMfiYL20RkfqRHPOqnbYaw+Q6kOEm8WAQ==
-----END RSA PRIVATE KEY-----
Llave en .pem
pág. 12
3.1. Listado de los recursos creados
pág. 13
Como podemos ver se creo correctamente la plantilla
pág. 14
Instancia privada con ip 10.0.60.251
Subnet
pág. 15
3.2. Conexión al host Bastión por ssh (consola)
Como se puede apreciar ya nos conectamos al host Bastión por cmd (consola)
Ahora debo de tener la key name del ec2 privada en mi host Bastión. Para así poder
conectarme a este. Para ello creo una carpeta dentro del usuario ec2-user llamado llave
y dentro de este creo un archivo similar al que descargue cuando cree la key de la EC2
privada
Y como podemos apreciar ya nos hemos conectado al EC2 privado a través del host
Bastión
pág. 16
Eso seria todo el proceso de creación, configuración y conexión al host Bastión, que
a través de esto nos conectamos por conexión ssh al host privado.
4. Conclusiones
La automatización a través de plantillas de AWS CloudFormation que pueden
lanzar una vpn, un grupo de seguridad, varias subnet y una EC2 dentro de estas.
Es esencial para los administradores de redes, para así optimizar recursos y
tiempo, y enfocarse en tareas menos repetitivas.
Anexo
Código completo en formato .yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: >
Infraestructura con Bastion Host y EC2 Privada
utilizando AWS Cloud Formation.
Parameters:
Montaje:
Description: Environment type.
Default: verdadero
Type: String
AllowedValues:
- verdadero
- falso
ConstraintDescription: must specify verdadero or falso.
#clave para ingresar por ssh al host bastion
KeyNameBastion:
Description: Nombre de la clave (KeyPair) existente para acceder a la
instancia
Type: AWS::EC2::KeyPair::KeyName
ConstraintDescription: Debe ser el nombre de una clave (KeyPair) válida
existente en tu cuenta de AWS.
#clave para ingresar por ssh al host EC2
KeyNameEC2:
Description: Nombre de la clave (KeyPair) existente para acceder a la
instancia
Type: AWS::EC2::KeyPair::KeyName
ConstraintDescription: Debe ser el nombre de una clave (KeyPair) válida
existente en tu cuenta de AWS.
RegionStack:
Type: String
Default: us-east-1
pág. 17
AllowedValues:
- us-east-2
- us-east-1
Description: Enter us-east-2, or us-east-1. Default is us-east-2.
BastionInstanceType:
Type: String
Default: t2.micro
AllowedValues:
- t2.micro
- t2.nano
- t2.small
Description: Enter t2.micro, t2.nano, or t2.small. Default is t2.micro.
BastionInstanceSO:
Type: String
Default: AmazonLinuxHVM64
AllowedValues:
- AmazonLinuxHVM64
- UbuntuLinuxHVM64
Description: Enter AmazonLinuxHVM64, or UbuntuLinuxHVM64. Default is
AmazonLinuxHVM64.
PrivateInstanceType:
Type: String
Default: t2.micro
AllowedValues:
- t2.micro
- t2.nano
- t2.small
Description: Enter t2.micro, t2.nano, or t2.small. Default is t2.micro.
PrivateInstanceSO:
Type: String
Default: AmazonLinuxHVM64
AllowedValues:
- AmazonLinuxHVM64
- UbuntuLinuxHVM64
Description: Enter AmazonLinuxHVM64, or UbuntuLinuxHVM64. Default is
AmazonLinuxHVM64.
VpcCidr:
Type: String
Default: 10.0.170.0/24
Description: Direccion de red para la VPC
AllowedPattern:
"(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})"
ConstraintDescription: Debe ser una CIDR valida ( Ej. 10.0.50.0/24)
pág. 18
PublicSubnetCidr:
Type: String
Default: 10.0.170.0/25
Description: Direccion de red para la Subred Publica
AllowedPattern:
"(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})"
ConstraintDescription: Debe ser una CIDR valida ( Ej. 10.0.50.0/25)
PrivateSubnetCidr:
Type: String
Default: 10.0.170.128/25
Description: Direccion de red para la Subred Privada
AllowedPattern:
"(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})"
ConstraintDescription: Debe ser una CIDR valida ( Ej. 10.0.50.128/25)
NombreSubredPublica:
Type: String
Default: Subred Publica
Description: Introducir el nombre para la subred publica
NombreSubredPrivada:
Type: String
Default: Subred Privada
Description: Introducir el nombre para la subred privada
Mappings:
RegionMap:
us-east-2:
"AmazonLinuxHVM64": "ami-098dd3a86ea110896"
"UbuntuLinuxHVM64": "ami-0430580de6244e02e"
us-east-1:
"AmazonLinuxHVM64": "ami-09538990a0c4fe9be"
"UbuntuLinuxHVM64": "ami-0261755bbcb8c4a84"
Conditions:
CreateProdResources: !Equals
- !Ref Montaje
- verdadero
Resources:
#creacion de la vpc
myVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VpcCidr
EnableDnsSupport: 'true'
EnableDnsHostnames: 'true'
Tags:
pág. 19
- Key: stack
Value: VPC de desarrollo
InternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}
VPCGatewayAttachment:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
InternetGatewayId: !Ref InternetGateway
VpcId: !Ref myVPC
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref myVPC
PublicSubnetsRoute:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
DependsOn: VPCGatewayAttachment
PublicSubnetRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet
RouteTableId: !Ref PublicRouteTable
PrivateRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref myVPC
PrivateSubnetsRoute:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref PrivateRouteTable
DestinationCidrBlock: 0.0.0.0/0
NatGatewayId: !Ref NatGateway
PrivateRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
pág. 20
Properties:
SubnetId: !Ref PrivateSubnet
RouteTableId: !Ref PrivateRouteTable
PrivateSubnet:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone: !Select [1, !GetAZs ""]
CidrBlock: !Ref PrivateSubnetCidr
MapPublicIpOnLaunch: false
VpcId: !Ref myVPC
Tags:
- Key: Name
Value: !Ref NombreSubredPrivada
MyEC2InstancePrivate:
Type: "AWS::EC2::Instance"
Properties:
ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", !Ref
PrivateInstanceSO]
InstanceType: !Ref PrivateInstanceType
AvailabilityZone: !Select [1, !GetAZs ""]
KeyName: !Ref KeyNameEC2
SubnetId: !Ref PrivateSubnet
pág. 21
SecurityGroupIds:
- Ref: PrivateSecurityGroupSSH
PrivateSecurityGroupSSH:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: "Permitir conexiones ssh"
VpcId: !Ref myVPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
SecurityGroupEgress:
- IpProtocol: -1
FromPort: -1
ToPort: -1
CidrIp: 0.0.0.0/0
MyEIP:
Type: AWS::EC2::EIP
Properties:
InstanceId: !Ref MyEC2InstancePublicBastion
EipNat:
Type: AWS::EC2::EIP
Properties:
Domain: vpc
DependsOn: VPCGatewayAttachment
NatGateway:
Type: AWS::EC2::NatGateway
pág. 22
Properties:
AllocationId: !GetAtt EipNat.AllocationId
SubnetId: !Ref PublicSubnet
MountPoint:
Type: 'AWS::EC2::VolumeAttachment'
Condition: CreateProdResources
Properties:
InstanceId: !Ref MyEC2InstancePrivate
VolumeId: !Ref NewVolumeEBS
Device: /dev/sdh
NewVolumeEBS:
Type: 'AWS::EC2::Volume'
Condition: CreateProdResources
Properties:
Size: 8
AvailabilityZone: !Select [1, !GetAZs ""]
Outputs:
ElasticIP:
Description: Elastic IP value
Value: !Ref MyEIP
NatElasticIP:
Description: Ip elastica para el gatway NAT para que la suberd privada
tenga acceso a internet mediante la subred publica
Value: !Ref EipNat
VpcId:
Value: !Ref myVPC
Description: ID de la VPC creada
Export:
Name: VpcId
VpcCIDR:
Value: !GetAtt myVPC.CidrBlock
Description: Rango de red (CIDR block) de la VPC
Export:
Name: VpcCIDR
PublicSubnetId:
Value: !Ref PublicSubnet
Description: ID de la subred pública creada
Export:
Name: PublicSubnetId
PrivateSubnetId:
Value: !Ref PrivateSubnet
Description: ID de la subred privada creada
Export:
pág. 23
Name: PrivateSubnetId
pág. 24