И така, следвайки най-добрите практики за сигурност, вие настройвате своя RDS, Elasticache или EC2 екземпляр в частна подмрежа. Следващият въпрос е как да се свържете с ресурса от вашата локална машина за отстраняване на грешки или от CI/CD конвейер за мигриране и внедряване.

В първата част на тази статия ще опиша стандартния подход за свързване към ресурси, скрити от интернет в частни подмрежи. Няма да навлизам в много подробности за ръчната настройка на всичко, тъй като във втората част ще представя CLI инструмент, който автоматизира рутината вместо вас и поддържа цената на решението възможно най-ниска.

Бастион домакини

Един от най-често използваните подходи за свързване към база данни или всеки друг ресурс в частна подмрежа на AWS е създаването на бастион EC2 екземпляр в същата мрежа като целевия ресурс, но в публична подмрежа. По този начин вие правите бастионния хост достъпен от интернет, а целевия ресурс – достъпен само от бастионния хост. Бастионът става единствената входна точка в интернет за вашите скрити ресурси. Той също така контролира достъпа до вашите ресурси, обработващи удостоверяване и оторизация на входящата връзка.

SSH тунелиране и AWS Session Manager

Добре, тогава как се свързвате с вашата база данни през bastion host? Има няколко начина да направите това: SSH тунелиране и препращане на порт на AWS Session Manager. И двата подхода означават да направите вашата скрита цел достъпна на вашия localhost чрез пренасочване на трафик от порт на вашата локална машина към целта през бастионния хост. Използването на SSH тунелиране предполага управление на SSH ключове и излагане на портове на вашия бастион хост. Защо да се занимавате с SSH, ако използвате AWS? В AWS удостоверяването и оторизацията могат да бъдат делегирани на IAM.

AWS Session Manager (който е част от AWS Systems Manager) позволява установяване на защитени сесии за пренасочване на портове, без дори да излагате вашия бастионен хост на интернет. Цялата комуникация се извършва чрез „задния“ канал на мениджъра на сесии. Systems Manager е част от AWS CLI, така че единственото нещо, което се изисква, за да го използвате, е „правилно конфигуриран“ AWS набор от инструменти на вашата машина. Друго предимство на използването на Session Manager е възможността за проверка на достъпа, която е полезна в екипи и организации. Това се постига чрез поддържане на история на всички връзки, направени през бастионния хост.

Недостатъци на ръчното управление на бастионния хост

Има и някои недостатъци на този подход. На първо място, цената на решението. Трябва да платите за бастионния хост, работещ 24/7, или да управлявате състоянието му ръчно, като го спирате, когато не е необходим. Последният подход работи само докато не видите сметка от AWS и разберете, че сте забравили да изключите инстанцията един ден. Друг недостатък са актуализациите на софтуера, които ще трябва да правите редовно и най-вероятно ръчно, за да запазите вашия бастион хост защитен.

Автоматизирайте управлението на бастиони с Basti

Представяме ви Basti, CLI инструмент с отворен код, който автоматично настройва бастионен хост, държи го спрян, когато не се използва, обработва софтуерни актуализации, за да поддържа защитения бастионен екземпляр, и излага лесен за използване CLI интерфейс, който позволява можете да се свържете с вашата цел с една команда от вашата локална машина или CI/CD конвейер.

За този пример ще използваме екземпляр на PostgreSQL RDS като цел за връзка. Можете обаче също да се свържете с RDS MySQL, Aurora, Elasticache или всеки частен екземпляр на EC2, следвайки същия набор от инструкции.

Предпоставки

  1. Уверете се, че идентификационните данни на AWS са настроени правилно на вашата машина. Basti не използва AWS CLI, но поддържа всички свои методи за конфигуриране, включително идентификационни данни, конфигурирани с команда aws configure. Като цяло трябва да очаквате Basti да работи, ако AWS CLI работи във вашия терминал.
  2. „Инсталиране на Basti с NPM“. Очаквайте скоро и други методи за инсталиране.
npm install -g basti

Инициализирайте своя бастион

Сега използвайте командата basti init, за да настроите екземпляра на bastion EC2 и да конфигурирате вашата цел за връзка (в този случай RDS екземпляр), за да приема връзки от хоста на bastion. Трябва да изпълните тази команда само веднъж. Командата е интерактивна, така че ще бъдете подканени да въведете всички необходими данни по пътя.

Първо изберете екземпляра на RDS от списъка с възможни цели за свързване, открити във вашия акаунт.

Сега изберете обществена подмрежа за екземпляра на bastion, в който да бъде създаден.

Басти ще разбере всичко останало вместо вас и ще завърши настройката на инфраструктурата.

Свържете се с вашата цел

Сега можете да започнете сесия за препращане на порт с командатаbasti connect. Ще изберете цел, към която да се свържете, и локален порт, на който целта ще стане достъпна.

И накрая, можете да се свържете с вашата база данни, сякаш тя работи локално.

Свържете се с персонализирана цел

С Basti можете също да се свържете с персонализирана услуга, работеща на екземпляр на EC2. Този метод може да се използва за свързване към цел, за която Basti все още не предоставя първокласна поддръжка.

За да инициализирате персонализирана цел, изберете „Персонализирана“ като цел в командата basti init. Ще бъдете подканени да посочите VPC на вашата цел и публична подмрежа, в която да създадете екземпляр на бастион. Когато екземплярът на бастион е настроен, той може да се използва за достъп до всяка цел в избрания VPC. Просто трябва да се уверите, че целта е достъпна от екземпляра на бастиона, като добавите входящо правило към групата за сигурност на целта.

За да се свържете с персонализираната цел, изберете „Персонализирана“ като цел в командата basti connect. Ще бъдете подканени да въведете VPC, адрес и порт на целта. Както обикновено, ще изберете местния порт, на който да изложите целта си.

Basti в CI/CD конвейер

С Basti можете също да се свържете с вашата цел от тръбопровод за автоматизация, който работи извън вашия VPC (в GitHub Actions, CircleCI или GitLab, например).

Всички команди на Basti поддържат автоматичен (неинтерактивен) режим, в който можете да предавате всички входове като аргументи на командния ред.

# Initialization
basti init --rds-instance <your-instance-id> --bastion-subnet <your-subnet-id> 

# Connection
basti connect --rds-instance <your-instance-id> --local-port <your-port>

# Cleanup
basti cleanup -y

Честито!

Вашата връзка вече е сигурна и рентабилна 🔒 🎉

Не забравяйте 👏 тази статия, ако я намерите за полезна и ⭐️ Basti, ако е направила живота на вашия програмист малко по-лесен!

Обмислям създаването на последваща статия за инженерството зад Basti и подробностите за неговото изпълнение. Кажете ми в коментарите, ако намирате тази тема за интересна!