Cloudflare Zero Trust warp

Thank you for reading this post, don't forget to subscribe!

настра­и­ва­ем zero trust

terraform module

при откры­тии zero trust он попро­сит создать имя орга­ни­за­ции, после его мож­но посмот­реть тут:

settings → Custom Pages

настра­и­ва­ем policy  для autentification

Access -> Policies -> Add Policy

тут настра­и­ва­ем, имя поли­си ста­вим action → Allow, сес­сию настро­ил на 1 неделю.

так как авто­ри­зо­вы­вать­ся будем по email (пока одна­ро­зо­вый пароль, даль­ше пока­жу как настро­ить и SSO) выби­ра­ем Email ending in и наш email, так же в Require ука­зы­ва­ем метод аутен­ти­фи­ка­ции pin (для sso пока­жу настрой­ку ниже)

даль­ше настра­и­ва­ем tunnel

Networks → Tunnels → Add a tunnel

выби­ра­ем опе­ра­ци­он­ку на кото­рой будет запу­щен тунель:

созда­дим ещё один тун­нель Cloudflared

выби­ра­ем нашу ось

даль­ше необ­хо­ди­мо выбрать нашу внут­рен­нюю под­сеть, пока мож­но ука­зать любой ip мы попра­вим это потом

далее под­ни­ма­ем instance во внут­рен­ней сети вот моя сеть, в мир хожу через nat

вот route table

вот network acl той subnet где будем под­ни­мать instance

вот security group

далее созда­ём instance

aws → ec2 → launch instance

под­ни­мать будем на free tier

выби­ра­ем наш ssh key и выби­ра­ем нашу  security group и vpc

всё, этих настро­ек хва­та­ет, диск остав­лю по дефол­ту на 8 gb и запус­каю instance

под­клю­ча­ем­ся к серверу:

под­клю­ча­ем­ся instance c помо­щью наше­го при­ват­но­го ssh ключа:

ssh -i "worker.pem" ec2-user@IP

sudo su -

даль­ше ста­вим то что нам пока­зал cloudflare при созда­нии warp tunnel

 

после выпол­не­ния коман­ды
warp-cli connect про­па­да­ет доступ по ssh поэто­му луч­ше настро­ить ssm

созда­ём допол­ни­тель­ную virtual network в cloudflare

идём Settings → Warp Client → Virtual networks → Add new

пра­вим route кото­рый мы ранее созда­ва­ли, ука­зы­ва­ем subnet наше­го vpc 10.115.0.0/16

Networks → Routes 

созда­ём ещё один route в кото­ром ука­зы­ва­ем ту же subnet, tunnel от cloudflared и вир­ту­аль­ную сеть warp-virtual-network

настра­и­ва­ем warp-client

Settings → WARP Client - > Device enrollment permissions → Manage

выби­ра­ем нашу policy

теперь в Settings → WARP Client вклю­чим Override local interface IP и настро­им default Profile settings

из exclude нуж­но уда­лить под­се­ти в кото­рые мы попадаем

я уда­лил 10.0.0.0/8

доба­вим google auth

Settings - Authentication -> Login methods - > Add new

там есть подроб­ная инструк­ция со скрин­шо­та­ми куда захо­дить в google console и что создавать

и попра­вим autentification policy оста­вим толь­ко по email

что­бы был доступ к дру­гим окру­же­ни­ям (кла­сте­рам) нуж­но под­нять туне­ли и до них:

вот роуты

под­се­ти
10.114.0.0/16
10.115.0.0/16
10.102.0.0/16
10.118.0.0/16
это vpc в аккаунтах

настро­им под­клю­че­ние кли­ен­та, вот тут мож­но ска­чать кли­ент для warp

https://developers.cloudflare.com/warp-client/get-started/

вво­дим имя организации

даль­ше может вой­ти по sso или вруч­ную вве­сти наш email и мы полу­чим на почту одно­ра­зо­вый код

и под­клю­че­ние на linux (ubuntu)

https://pkg.cloudflareclient.com/

 

вво­дим имя организации:

 

terraform module

вот terraform module для запус­ка cloudflared и warp tunnel

/infra/terraform/modules/cloudflared-zero-trust/main.tf

/infra/terraform/modules/cloudflared-zero-trust/variables.tf

/infra/terraform/modules/cloudflared-zero-trust/templates/user_data_cloudflared.sh.tpl

/infra/terraform/modules/cloudflared-zero-trust/templates/user_data_warp.sh.tpl

/infra/terraform/modules/cloudflared-zero-trust/README.md

 

 

для кор­рект­ной рабо­ты создан во всех акка­унт aws secret cloudflare-zero-trust

в кото­ром 2 переменные,
cloudflare_account_id - это акка­унт id кото­рый берём из кла­уд­флей­ра вот тут:

cloudflare_api_token - это токен кото­рый созда­ём тут:

вот с таки­ми правами:

 

запуск моду­ля с terraform

/infra/infrastructure/aws/prod/cloudflared-zero-trust.tf

tunnel_name - на осно­ве это­го име­ни будет созда­вать­ся тунель в cloudflare и ec2 instance в aws (может быть любым)
private_cidr - это под­сеть нашей VPC
enable_warp - мы выклю­ча­ем так как warp tunnel нужен толь­ко в одном аккаунте
subnet_id - это саб­нет где запус­ка­ем наши ec2 instance
secret_name - имя сек­ре­та в кото­ром id акка­ун­та и токен
instance_type - хва­та­ет free tier тачки
key_name - это наш при­ват­ный ssh ключ с помо­щью кото­ро­го мы можем под­клю­чать­ся к ec2 instance

 

теперь рас­смот­рим уста­нов­ку как cloudflared tunnel так и warp tunnel в infrastructure cluster но запуск будет из terragrunt

/infra/terragrunt/infrastructure/eu-central-1/infra/cloudflare-zero-trust/terragrunt.hcl

/infra/terragrunt/infrastructure/eu-central-1/infra/cloudflared_zero_trust.hcl

 

для cloudflared пере­мен­ные все те же самые, а вот пере­мен­ные кото­рые нуж­ны для запус­ка warp tunnel

enable_warp - вклю­ча­ем warp
warp_cidr - это subnet в рам­ках кото­рой запу­щен warp tunnel
create_virtual_network - вклю­ча­ем созда­ние вир­туль­ной сети - она необ­хо­ди­ма что­бы при под­клю­че­нии к warp tunnel тра­фик мог досту­чать­ся до cloudflared tunnel
warp_virtual_network_name - имя вир­ту­аль­ной сети (может быть любым)
warp_team - имя орга­ни­за­ции, кото­рое созда­ёт­ся в пане­ли cloudflare при созда­нии zero-trust

запус­ка­ем аплай из дирек­то­рии /infra/terragrunt/infrastructure/eu-central-1/infra/cloudflare-zero-trust

у Warp инста­ля­ции есть осо­бен­ность, после пер­во­го запус­ка будет создан ec2 instance, в кото­ром через curl POST запро­сом будет создан warp tunnel, для созда­ния route нуж­но ещё раз запу­стить terragrunt apply, тогда будет полу­чен ID от warp tunnel и будет создан route.
такой костыль сде­лан пото­му что на момент созда­ния в про­вай­де­ре ещё нет соот­вет­ству­ю­ще­го resource.

если тунель мину­ты 2,3 не пере­хо­дит в ста­тус HEALTHY то тогда нуж­но под­клю­чить­ся к ec2 instance и выпол­нить коман­ду warp-cli --accept-tos connect

после это­го может про­пасть доступ по ssh но для это­го instance под­клю­че­на роль с ssm

так же отме­чу что для всех instance я не исполь­зо­вал жёст­ко задан­ные ami - при уста­нов­ке исполь­зу­ют­ся самые новые на момент запуска.