Friday, July 29, 2016

AWS Elastic Beanstalk Environment URL ve security groups

AWS Elastic Beanstalk ile bir uygulama sunmak istediğinizde önce bir application sonra da bir environment (ortam) oluşturuyoruz. Uygulama ortamı oluşturduğumuzda, o ortama erişimimizi sağlayan bir URL de elde etmiş oluyoruz.

Bu EB ortamını her zaman gerçek bir domaine yönlendirmiyoruz. Çünkü örneğin bir uygulama altında production ortamını gerçek bir domaine yönlendirmek gerekse de, bir test ortamını sadece geliştirme ekibi kullanacağından gerçek bir domaine her zaman ihtiyaç olmuyor.

Test ortamı ile ilgili farklı ihtiyaçlar da ortaya çıkabiliyor elbette. AWS EB ortamları için kabaca şu formatta bir domain oluşturuyor :

ortam_adı.region_adı.elasticbeanstalk.com 

Her ne kadar production da çalışan bir sitenin test ortamının adresini tahmin etmek ve ulaşmak kolay olmasa da gene de güvenlik açısından bir test ortamının adresinin sadece belli IP lerden erişilebilmesini sağlama gerekebiliyor. Bunu sağlamak için de genelde "security groups" lardan bazı ayarlamalar yapmak gerekiyor. Ve bu noktada ortam adresinin tam olarak neyi temsil ettiği konusu önem kazanıyor.

Konumuz bu ayarları nasıl yapacağımız değil daha çok hangi security group'ta bu ayarları yapmamız gerektiği ile ilgili. Çünkü zaten hangi security group'ta ayar yapmak gerektiği belirlendikten sonra, sadece belli IP lere izin vermek çok kolay birşey.

Bir EB ortamı 2 farklı tipte kurulabiliyor. 1) Single instance 2) Load balancing/auto scaling.

İlk tipte kurulan bir EB ortamı arkada sadece bir EC2 instance ile oluşmuş oluyor. Tüm istekleri de bu EC2 instance karşılıyor. Dolayısıyla EB ortam adresi de doğal olarak EC2 instance ile birebir ilişkilendirilmiş oluyor. Ortam adresine sadece belli IP lerin erişimi sağlanmak istenirse, EC2 security group ayarları değiştirilerek yapılabiliyor. (Önde sonradan eklenmiş bir load balancer, cloudfront vb. olmadığını varsayıyorum)

Asıl mesele load balancing/auto scaling tipinde kurulmuş EB ortamları. Çünkü bu ortamlar kurulduğunda, özel bir müdahale olmamış ise aşağıdakine benzer bir yapı oluşmuş oluyor.

EC2 Instances (Application) -> Load Balancer -> İnternet

Bu yapı ile beraber, default security group haricinde, ayrıca bir EB security group ve ELB security group da otomatik olarak oluşturulmuş oluyor. EB security group içinde ELB security group da özellikle HTTP portu için referans olarak yerini almış oluyor.

Yapıyı biraz daha detaylı göstermek istersek :

EC2 Instances (default + EB security group) -> Load Balancer (ELB security group) -> İnternet

şeklinde ifade edebiliriz.

EB security group (Inbound) kuralı kabaca :

Protocol : TCP
Port : 80
Source : ELB security group

şeklinde görünecektir.

ELB security group'ta ise (Inbound) :

Protocol : TCP
Port : 80
Source : 0.0.0.0/0

şeklinde otomatik bir kural tanımlanmış olacaktır.

EB ortamının kendine ait bir URL'i olduğu gibi, Load Balancer'ın da kendine ait bir domaini bulunmaktadır. Ve load balancer domainini çağırdığınızda, EB ortam adresi çağrılmış gibi uygulamanızı açtığını göreceksiniz. Zaten normal olan da budur.

Peki, EB ortam adresinin sadece belli IP lerden erişilmesini istersek, hangi security group'taki kuralı değiştirmek veya nasıl bir değişiklik yapmak gerekir? Bu soruyu doğru cevaplamak için EB ortam adresinin tam olarak neye karşılık geldiğini bilmemiz gerekiyor.

Otomatik isimlendirmeler nedeniyle EB security group (EC2 ya ait grup) sanki EB adresinden sorumlu olmalı gibi hissediyor olabiliriz. Uygulamanın çalıştığı katmanın adresi olarak düşünüyor olabiliriz. Ve aslında load balancerları kullanıyor olmak için, aslında test adresimizin load balancer domaini olması gerektiği sonucuna da varabiliriz. Bunlar tamamen yanlış değil. Çünkü gerçek bir domain yönlendirmek isteseydik, DNS kaydı ekleyeceğimiz adresin load balancer domaini olmasında bir sakınca bulunmuyor.

Fakat bu düşünce yaklaşık olarak şuna karşılık geliyor olurdu :

EB ortam adresi  = EB Environment [EC2 Instances]
ELB adresi = Load balancers

Yani EB ortamı denilen şey aşağı yukarı oluşturulmuş EC2 instanceların toplamı şeklinde anlaşılabilirdi. Fakat durumun öyle değil şu şekilde olduğu anlaşılıyor :

EB ortam adresi = EB Environment [EC2 Instances + Load balancers (endpoint)]
ELB adresi = Load balancers

Yani eğer load balancer/auto scaling tipinde bir EB ortamı kurmuşsanız, aslında otomatik olarak eklenen load balancerlar sizin bu ortamınızın bir parçası. Dolayısıyla da EB ortam adresiniz, Load balancerları da içine alan bir bütünün toplamının adresi. Bu nedenle de EB ortam adresini bu kurulumda karşılayan EC2 makinaları değil, kurulumun son çıkış noktası olarak load balancerlardır.

Bunu EB ortam domaini ile load balancer domainini nslookup/dig ile çözümleyerek kontrol edebileceğiniz gibi, EB ortam adresine yapmış olduğunuz isteklerin load balancerdan geçip geçmediğini de monitor ederek kontrol edebilirsiniz.

Sonuç olarak EB security group denilen güvenlik kuralları aslında zincirin son halkasını (EC2) tarafını karşılıyorlar, eğer önde bir load balancer otomatik eklenmişse, ortam adresine erişim ilk olarak load balancerlardan geçiyor demektir. Dolayısıyla IP erişim kurallarını ilk olarak orada tanımlamak gereklidir.

Sadece EB security group'da değişiklik yaparak, EB ortam adresine erişim IP bazında kısıtlanabilir mi? Evet olabilir:) Çünkü bir şeyi yapmanın elbette farklı bir yolu da olacaktır. Fakat ilk akla gelebilecek bazı yöntemler muhtemelen istenildiği gibi çalışmayacaktır.

Örneğin, EB security group'ta yukarıda yazdığım gibi load balancer'a ait güvenlik grubu bir source olarak tanımlanmış durumda. Bu load balancerdan gelen isteklere erişim veren bir kural. Eğer bu kuralı silerseniz, ortam adresi aslında load balancer üzerinden geldiğinden, artık load balancerlar üzerinden gelen isteklere EC2 cevap vermeyecek demektir. Bu da EB ortam adresinin muhtemelen HTTP 503 almasına yol açacaktır.

Load balancer IP lerine izin vermeyi denemek de bir opsiyon değil zira AWS IP lerin değişken olduğunu iletiyor.

ELB security group'u kaldırmadan EB security group içine istediğimiz IP lere erişim veren bir kural da yazmak işe yaramaz. Zira EB ortam adresi load balancer üzerinden geldiği ve buradan gelen herkese izin verdiğiniz için, ekleyeceğiniz IP kuralı hiç bir zaman geçerli olmayacaktır. Zira load balancer tarafında tüm IP lere erişim izni bulunuyor olacak.

EB security group üzerinde load balancer ı direkt kısıtlayan herhangi bir kuralın ayrıca health checkleri engellememesi de gerekir. Bir yandan da auto-scaling tipinde bir ortam kurulduğu için cloudwatch'un da çeşitli kontrollerini sağlıklı bir şekilde yapabilmesi gerekmektedir.

EB ortamınızın adresinin ortamın tüm unsurlarını içeren adres olduğunu unutmayın :)