Birinchi dars: o'rta sirli rasmda siringizni oshkor qilmang

Sirlarni ilovangizda saqlashning eng yaxshi usuli bu sirni ilovangizda saqlash emas

Rad etish: Ushbu maqolada tasvirlangan usul AWS ga juda bog'liq. Aytilishicha, kontseptsiya boshqa provayderlarga ham tegishli bo'lishi mumkin ...

Agar siz Internetda biron bir ilova yaratgan bo'lsangiz, sirlaringizni (ma'lumotlar bazasi ma'lumotlari, api kalitlari va hk) serveringizda saqlash kurashiga duch keldingiz.

Tarixan, ishlab chiquvchilar bunga erishishning bir necha usulini topdilar. Ularning har biri ma'lum darajadagi xavfsizlik va qulaylikka ega. Sizni ular orqali kezaman, shunda biz qayerdan kelganimizni anglay olasiz.

Kodingizda sirlarni saqlash

# sozlamalar / instance_settings.py
STRIPE_API_KEY = '3ef8-843a-49dc-a34d' # Hech kimga aytma! plz?

Bu shubhasiz eng qulay usul. Siz o'zingizning API kalitingizni kodingizda doimiy ravishda yozasiz, so'ngra uni manba boshqaruviga o'tkazasiz va voilà!

Ammo, bu eng kam xavfsiz usul ham. Siz shunchaki muhim sirni har bir ishlab chiqaruvchining kompyuterida (yoki tashqi drayvlarda), sizning manbangizni boshqarish provayderingizning omborida, CI provayderingizning serverida va hokazolarda tarqalishiga ruxsat berdingiz, bu sirning tarqalishi xavfini oshiradi.

Atrof-muhit sirlarini saqlash

stripe_api_key = os.environ ["STRIPE_API_KEY"]

Bu men tez-tez ishlatib turadigan narsadir. Siz har bir serverda ushbu atrof-muhit o'zgaruvchilarini qo'lda sozlashingiz kerak yoki oldingisiga qaraganda biroz qulayroq bo'lgan o'zingiz uchun qandaydir orkestratordan foydalanishingiz kerak bo'ladi. Shunga qaramay, faqatgina ba'zi ishonchli odamlar foydalana oladigan narsaga ega bo'lishlari mumkin.

Hali ham muammolar mavjud: oddiy noto'g'ri konfiguratsiya (masalan, ishlab chiqarish serverini disk raskadrovka rejimida ishga tushirish) yoki xavfsizlik xatosi atrof-muhitning barcha o'zgaruvchilarining tarqalishiga olib kelishi mumkin.

Ma'lumotlar bazasida sirlarni saqlash

Men bu haqda qisqacha aytaman: siz hali ham biron bir joyda sizning ma'lumotlar bazangizning shaxsiy ma'lumotlarini saqlashingiz kerak bo'ladi, shuning uchun u erda sizning siringizni saqlash maqsadini buzadi. Bundan tashqari, barcha xizmatlaringizning API kalitlarini har kuni zaxira qilish, ba'zi bir vaqtlarda sizib ketish xavfini oshiradi.

Sirlarni sinxronlash xizmatidan foydalanish

API kalitlari va siz uchun boshqa sirlarga g'amxo'rlik qilishni taklif qiladigan SaaS mavjud. Ularni xavfsiz saqlaydi va kerak bo'lganda ularni xizmatlaridan so'rashga imkon beradi. Oldingi usulda biz hamon hanuz muammoga duch kelyapmiz: barcha API kalitlarni olish uchun sizga juda maxfiy API kaliti kerak bo'ladi.

Kodingizda sir saqlanmoqda ... lekin shifrlangan

Birinchi usulning zamonaviy versiyasi - bu sizning kodingizdagi sirlarni shifrlash, shuning uchun ularning qiymatlarini sizning manbangizni boshqarish, boshqa ishlab chiquvchilar va boshqalarga etkazmaslik. Biroq, ushbu sirlarning shifrini ochish uchun server hali ham kalitni boshqarishi kerak. Bu boshqa sirlarning hammasini ochadigan bitta ulkan sirni tarqatish va saqlash masalasiga qaytadi.

Nima uchun xavfli?

Ushbu usullarning barchasi bir xil xarakterga ega; ular hali ham sizning serveringizda sir saqlanishini o'z ichiga oladi va ular chiqib ketishi yoki o'g'irlanishi mumkin

Eng yomon ish stsenariysi

Quyidagi stsenariyni tasavvur qiling. Apache-dagi zaiflikdan foydalanib, buzg'unchi sizning serveringizga kirib ketdi. Keyin u konfiguratsiya faylida, kodingizda, muhitda ma'lumotlar bazasi ma'lumotlari va API kalitlarini qidirishni boshlaydi. Agar sizning sirlaringiz qaysidir ma'noda yashirin / shifrlangan bo'lsa, tajovuzkor hech narsa topolmaydi. Ammo bu u u erda to'xtaydi degani emas. LiME kabi narsalarni ishlatib, hacker ushbu sirlarni olish uchun baribir server xotirasidagi axlatxonani ko'rib chiqishi mumkin.

Biz bundan ham yaxshiroq qila olamiz

Kirish:

Proksi ™ sifatida IAM tasdiqlangan API Gateway-dan foydalangan holda, ishonch yorlig'i bo'lmagan xizmatlarga kirish

(Men qiziq ismlarni topishdan qo'rqaman va bu aslida savdo belgisi emas).

Umumiy nuqtai

Xulosa qilib aytganda, biz EC2 instansiyamizning namuna rolidan foydalanib, API shlyuziga xavfsiz qo'ng'iroqni amalga oshirmoqdamiz, va u kerakli ma'lumotni qo'shib so'rovni o'zgartirgandan so'ng uni kerakli xizmatga yuboradi. Ew! Bu bitta jumla uchun juda ko'p ma'lumot.

Aytishlaricha, rasm 1000 so'zga to'g'ri keladi. DA'VAT QABUL QILINDI

Hali ham yo'qolganmisiz? Keling, buni oshkor qilaylik

Birinchidan, bu ishlashi uchun biz IAM rollaridan foydalangan holda boshqa AWS manbalariga qo'ng'iroq qilish uchun EC2 nusxalari (yoki ECS konteynerlari va Lambdalar) uchun mahalliy usuldan foydalanishimiz kerak.

Ikkinchidan, API Gateway-da Rest API manbasini yaratishimiz kerak. Tanani, sarlavhalarni va so'rov parametrlarini o'tish uchun ba'zi aniq konfiguratsiyalar mavjud. Bundan tashqari, biz maqsadli xizmat ma'lumotlarini kiritishimiz uchun so'rovni o'zgartirishimiz kerak. Va nihoyat, biz yashirin qurolni faollashtirishimiz kerak: IAM asosidagi avtorizatsiya.

Uchinchi va oxirgi qadam, kerakli proksi-xizmatlarga qo'ng'iroq qilishdan oldin, URL-ni imzolashdan iborat.

¿Que?

Men aytib o'tgan texnologiyalar bilan uncha yaxshi tanish bo'lmagan va bu nimaga bog'liqligini hali ham bilmayotgan bo'lsangiz, bu erda proksi-server sifatida IAM tasdiqlangan API shlyuzidan foydalanib, ishonch yorlig'i bo'lmagan xizmatlardan foydalanish taqqoslanishi:

Men ushbu namoyish uchun taniqli GitHub API va Postman-dan foydalanaman:

Oldin (GitHub-ga to'g'ridan-to'g'ri qo'ng'iroq):

Keyin (qo'ng'iroq API Gateway orqali proksi qilingan):

Siz aytganingizni allaqachon eshitishim mumkin:

Siz bu ma'lumotlarning ahamiyati yo'qligini aytdingiz va men kirish kaliti, maxfiy kalit va tokenni ko'rmoqdaman !!!

Buning sababi, tizza kompyuterimda yashirin qurol yo'q. Agar siz EC2 misolida ishlatsangiz va ushbu vaqtinchalik xavfsizlik ma'lumotlari avtomatik ravishda namuna metadatasidan olinadi. Agar vaqtinchalik hisobga olish ma'lumotlari tushunchasi siz uchun yangi bo'lsa, bu erda hujjatlardan parcha (diqqat minus):

[...] misolidagi dasturga rol bilan bog'liq bo'lgan xavfsizlik ma'lumotlari orqali rolni aniqlagan harakatlar va manbalar uchun ruxsat beriladi. Ushbu xavfsizlik ma'lumotlari vaqtinchalik va biz ularni avtomatik ravishda aylantiramiz. Eski hisob ma'lumotlari muddati tugashidan kamida besh daqiqa oldin yangi hisob ma'lumotlarini taqdim etamiz.

Shunday qilib, adolatli bo'lish uchun ushbu usul uchun aniqroq ta'rif uzoq muddatli ma'lumotlardan foydalanmasdan proksi sifatida IAM tomonidan tasdiqlangan API shlyuzidan foydalanib xizmatga kirish bo'ladi. Biroq, biz "IAM orqali cheklangan proksi-xizmatlarga qo'ng'iroqlarni amalga oshirishda foydalaniladigan qisqa muddatli vaqtinchalik ma'lumot" oddiy API kalitlari va boshqa uzoq muddatli sirlarga qaraganda tajovuzkorlar uchun kamroq jalb qilinadigan ekanligiga rozi bo'lishimiz mumkin.

Bu xavfsizlik nuqtai nazaridan juda katta yangilanishdir

Xavfsizlik sohasida sezilarli yaxshilanishlar:

  • Vaqtinchalik hisobga olish ma'lumotlari hech qachon ishlab chiquvchilar tomonidan qo'llanilmasligi kerak
  • Ular dasturiy ravishda so'raladi, shuning uchun ularni konfiguratsiya fayliga yozib qo'yishning hojati yo'q
  • Agar siz yashiringan bo'lsangiz yoki o'g'irlangan bo'lsangiz, ushbu vaqtinchalik hisob ma'lumotlari ko'pi bilan bir soat ishlaydi
  • Barcha so'rovlarni tekshirish uchun CloudWatch-ga kirish mumkin
  • Siz maqsadli API-ni IAM siyosati yordamida cheklashingiz mumkin

So'nggi o'q nuqtasi GitHub kabi API bilan ishlashda foydalidir, chunki u nozik tanlangan ruxsat modeliga ega emas. Quyidagi IAM siyosatidan foydalanib, men o'zimning API-ni faqat / repos / PokaInc / test-github-api / issues tugash nuqtasida GET usuliga ruxsat berish uchun cheklashim mumkin.

{
    "Versiya": "2012-10-17",
    "Bayonot": [
        {
            "Harakat": [
                "ijro etish-api: chaqirmoq"
            ],
            "Manba": [
                "arn: aws: ijro et-api: us-east-1: 123456789010: w974f1rs6e / dev / GET / repos / PokaInc / test-github-api / issues"
            ],
            "Effekt": "Ruxsat berish"
        }
    ]
}

Ammo kuting, yana ko'p narsalar!

Proksi sifatida API Gateway-dan foydalanishning boshqa afzalliklari

  • Foydalanish statistikasi. Bu tendentsiyalarni aniqlash va uchinchi tomon xizmatlari tomonidan narxlarni cheklashning oldini olish uchun foydali bo'lishi mumkin.
  • Jurnal. Yoqilganda, siz har bir so'rovning batafsil jurnallarini, jumladan kelib chiqishi va ishlatilgan parametrlarini olishingiz mumkin.
  • Keshlash. Kechikish yoki stavkalarni cheklash muammolari bormi? CloudFormation kodining uchta qatori bilan proksi-serveringizga kesh-server manbasini qo'shishingiz mumkin.
  • Mahalliy rivojlanish. Mahalliy IAM foydalanuvchisini ishlatadigan ishlab chiqaruvchilar proksi-server xizmatlaridan to'g'ridan-to'g'ri kompyuterlariga kirishlari mumkin.

Men sizga bu g'oyani sotib yuborgan deb taxmin qilaman va siz o'zingiz ushbu usulni sinab ko'rmoqchisiz.

Kod

Poka-da biz CloudFormation aphioadados ekanligimizni hisobga olib, men GitHub-da mavjud bo'lgan konkret-tushuncha shablonini yaratdim.

Tayyorlash

Proksi-serverni yaratish uchun README.md-dagi ko'rsatmalarga amal qiling.

Proksi-serverdan foydalanish

Bu o'qish kitobida ham tasvirlangan, ammo men buni qora sehr emasligiga ishonch hosil qilishim uchun bu erga joylashtiraman.

Ushbu kod blokini ko'rib chiqaylik:

return AWSRequestsAuth (
      [...]
      ** boto_utils.get_credentials ()
)

Odatda biz qattiq kodlangan hisob ma'lumotlarini, konfiguratsiya fayliga kirishni yoki atrof-muhitga so'rovni ko'ramiz. Buning o'rniga, bu usul vaqtinchalik kalitlarni metadata xizmatidan so'raydi. Agar EC2 nusxasi o'rni etarli ruxsatlarga ega bo'lsa, qo'ng'iroq GitHub-ga o'tadi, aks holda API Gateway rad etadi.

Xulosa

Ushbu maqola ilova serverlarida kam himoyalangan sirlar va API Gateway-ni proksi sifatida ishlatish qo'shimcha xavfsizlikdan qanday foyda ko'rishi haqida xabardorlikni oshirishga yordam berdi deb umid qilaman.

Ogohlantirishlar (va ularning echimlari)

  • Agar men Internetga ulanmagan ichki xizmatni proksi qilmoqchi bo'lsam nima bo'ladi?

Tushuntirishga bag'ishlangan shaxsiy blogi bo'lishi mumkin. Ammo qisqa hikoya, siz VPC yoqilgan AWS Lambda-ni sizning API Gateway proksi-serveringiz maqsadi sifatida taqdim etishingiz mumkin. Lambda sarlavhalarni, so'rov parametrlarini va tanani ichki xizmatga topshirishi, javobni to'plashi va uni API Gateway-ga qaytarishi kerak.

  • Bu REST API-larida juda yaxshi ishlaydi, ammo aloqador ma'lumotlar bazasi yoki kesh-serverlar kabi TCP xizmatlari haqida nima deyish mumkin?

Yana, bu to'liq blog postiga loyiqdir. Xulosa qilib aytganda, biz kerakli xizmatlar uchun to'g'ridan-to'g'ri hisob ma'lumotlarini yaratadigan mikro-xizmatni yaratishimiz mumkin (siz buni taxmin qilgansiz, IAM tomonidan tasdiqlangan API shlyuzi). Masalan: agar mikro-xizmatdan PostgreSQL hisobga olish ma'lumotlari talab qilinsa, u tasodifiy yaratilgan parol bilan CREATE ROLE buyrug'ini chiqarishi mumkin. Bundan tashqari, rol VALID UNTIL xususiyatidan foydalangan holda vaqtincha yashashga ega bo'lishi mumkin.

Shu bilan bir qatorda

Siz ishlab chiqarish ish yukini AWS-da ishlamayapsizmi? Ushbu usul siz uchun ishlamayaptimi? Sizda sirlarni boshqarishda yordam beradigan boshqa vositalar mavjud.

  • http://engineering.nike.com/cerberus/
  • https://www.vaultproject.io/
  • https://docs.docker.com/engine/swarm/secrets/

Ushbu maqola uchun havolalar:

http://blog.arkency.com/2017/07/how-to-safely-store-api-keys-in-rails-apps/
https://blog.rackspace.com/securing-application-secrets-with-ec2-parameter-store
https://www.envkey.com/
https://www.hashicorp.com/blog/Vault-announement/
https://docs.docker.com/engine/swarm/secrets/
http://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html
http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html
http://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html

Tuzatish uchun choy Rudolf, Etyen Talbot, Simon-Per Gingras, Maksime Leblanc va Marilu Simard-Barilga (ha, mening ingliz tilimni qayta ko'rib chiqishi uchun juda ko'p odamlar kerak) va Julie Dorion-Balangerga minnatdorchilik bildiraman.

Ushbu post haqida savollar / takliflar bormi? Quyida sharh yozing va men unga javob berish uchun qo'limdan kelganini qilaman.