我們需要無(wú)密碼訪問(wèn)數(shù)據(jù)庫(kù)!
在企業(yè)級(jí)應(yīng)用中我們可以看到眾多身份管理體系, AWS 身份授權(quán)管理(IAM)、企業(yè)身份管理、應(yīng)用身份管理體系等等。每個(gè)企業(yè)都試圖去創(chuàng)建一個(gè)統(tǒng)一的身份認(rèn)證平臺(tái),希望借此能夠解決企業(yè)內(nèi)的身份認(rèn)證問(wèn)題難題。
然而如此眾多的身份認(rèn)證體系中,居然沒有一個(gè)很優(yōu)雅的辦法解決應(yīng)用在連接數(shù)據(jù)庫(kù)過(guò)程中的密碼管理問(wèn)題!
這個(gè)問(wèn)題在微服務(wù)的場(chǎng)景下會(huì)凸顯出來(lái),想想海量服務(wù)對(duì)應(yīng)海量持久化方案吧。本著 Cloud Native 服務(wù)要無(wú)狀態(tài)的原則,我們這次就來(lái)設(shè)計(jì)一個(gè)“安全信息管理 as a services ”。通過(guò)這個(gè)服務(wù),應(yīng)用在不知曉數(shù)據(jù)庫(kù)的用戶名、密碼甚至數(shù)據(jù)庫(kù)地址的前提下,完成對(duì)數(shù)據(jù)庫(kù)服務(wù)的發(fā)現(xiàn),并授權(quán)連接。
同樣的架構(gòu)除了用來(lái)進(jìn)行數(shù)據(jù)庫(kù)密碼的管理外,也有很多與密碼管理相關(guān)的場(chǎng)景,比如用來(lái)保存密鑰等關(guān)鍵認(rèn)證信息。
安全高效密碼管理服務(wù)
我們先來(lái)回顧一下傳統(tǒng)架構(gòu)中大家是如何來(lái)做身份認(rèn)證的:
· 我們會(huì)將身份認(rèn)證分為基礎(chǔ)設(shè)施類的認(rèn)證與應(yīng)用程序類的認(rèn)證兩種主要形式,AD/LDAP 多被用在基礎(chǔ)設(shè)施類身份認(rèn)證上。
· AWS 平臺(tái)上提供 IAM 服務(wù),實(shí)現(xiàn)基礎(chǔ)設(shè)施類的認(rèn)證。值得一提的是,如果大家用 RDS Mysql/Aurora Mysql 數(shù)據(jù)庫(kù),IAM 已經(jīng)提供了對(duì)數(shù)據(jù)庫(kù)連接的授權(quán)管理。具體可以參照:https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html
· 在應(yīng)用類的認(rèn)證中,有很多單點(diǎn)登錄的方案,也可以與 AD 集成,或者通過(guò) oauth 等其他方式與第三方認(rèn)證服務(wù)集成。
然而,還有一些服務(wù)會(huì)采用提供用戶名、密碼訪問(wèn)的方式,并沒有與企業(yè)的統(tǒng)一身份認(rèn)證進(jìn)行集成 。
為何在這個(gè)領(lǐng)域
已有的技術(shù)手段為何并沒有被廣泛采用?
· 首先集成成本高,企業(yè)內(nèi)部數(shù)據(jù)庫(kù)系統(tǒng)可能有成百上千套,每套系統(tǒng)需單獨(dú)與 AD 集成。
· 即便做了集成管理,在授權(quán)時(shí)仍然要采用用戶名密碼或密鑰的方式,使用過(guò)程依然不安全。
· 因此目前主流方式是通過(guò)配置文件在本地加密保存,再在 Runtime 中由程序解密,過(guò)程非常復(fù)雜。
存在即合理,企業(yè)采用上述方式完成安全信息的保存成為了一種最佳實(shí)踐。
那么,在 AWS 上
如何解決和滿足這部分需求呢?
如果可以實(shí)現(xiàn)一套安全信息管理服務(wù),無(wú)論哪一層的開發(fā)者都無(wú)需再保存密碼;同時(shí)這些訪問(wèn)請(qǐng)求仍然通過(guò)合理的授權(quán)與認(rèn)證,并提供審計(jì)日志;抽象的服務(wù)本身使得定期更換數(shù)據(jù)庫(kù)密碼這樣的安全策略得以執(zhí)行。這樣,就可以用很小的成本解決企業(yè)中大量存在的安全隱患。
在此插播一個(gè)演示
我們數(shù)據(jù)庫(kù)創(chuàng)建程序片段如下:
#!/usr/bin/python
import mysql.connector
from mysql.connector import errorcode
from secureDB import secureconnection
DB_NAME = ‘mydbtest’
cnx = secureconnection()
cursor = cnx.cursor()
def create_database(cursor):
try:
cursor.execute(
'CREATE DATABASE {} DEFAULT CHARACTER SET 'utf8''.format(DB_NAME))
except mysql.connector.Error as err:
print('Failed creating database: {}'.format(err))
exit(1)
try:
cnx.database = DB_NAME
except mysql.connector.Error as err:
if err.errno == errorcode.ER_BAD_DB_ERROR:
create_database(cursor)
cnx.database = DB_NAME
else:
print(err)
exit(1)
for name, ddl in TABLES.items():
try:
print('Creating table {}: '.format(name), end='')
cursor.execute(ddl)
except mysql.connector.Error as err:
if err.errno == errorcode.ER_TABLE_EXISTS_ERROR:
print('already exists.')
else:
print(err.msg)
else:
print('OK')
cursor.close()
cnx.close()
我們提供的 sdk(secureDB.py)如下:
#!/usr/bin/python
import …
from aws_requests_auth.aws_auth import AWSRequestsAuth
def secureconnection():
client = boto3.client('sts')
response = client.assume_role(
RoleArn='arn:aws:iam::277052429340:role/sts_616532859444',
RoleSessionName='test',
DurationSeconds=1000
)
auth = AWSRequestsAuth(aws_access_key = response['Credentials']['AccessKeyId'],
aws_secret_access_key = response['Credentials']['SecretAccessKey'],
aws_token = response['Credentials']['SessionToken'],
aws_host = 'j0kym28ch1.execute-api.ap-northeast-1.amazonaws.com',
aws_region = 'ap-northeast-1',
aws_service = 'execute-api')
response = requests.get('https://j0kym28ch1.execute-api.ap-northeast-1.amazonaws.com/Prod/secret/,
auth=auth)
username = response.json()['Item']['username']
dbname = response.json()['Item']['dbname']
password = response.json()['Item']['secret']
return mysql.connector.connect(user=username, password=password,
host=dbname)
當(dāng)然我們這里必須要做一些授權(quán)工作:需要給執(zhí)行這段程序的 Amazon EC2 指定一個(gè) Role,簡(jiǎn)單來(lái)講,這個(gè) Role 將授權(quán) SDK 獲取數(shù)據(jù)庫(kù)用戶名密碼。
我們可以看到在客戶端或者 sdk 都沒有記錄用戶名、密碼、數(shù)據(jù)庫(kù)地址的情況下,客戶端程序仍然可以獲得數(shù)據(jù)庫(kù)連接,成功創(chuàng)建表結(jié)構(gòu)。
如果我們?nèi)∠?Role,客戶端程序則無(wú)法執(zhí)行成功。
熟悉 AWS 的同學(xué)就知道,IAM 確實(shí)可以實(shí)現(xiàn)無(wú)密碼的授權(quán),但是 IAM 并不能獲取服務(wù)內(nèi)部的權(quán)限,例如這里的數(shù)據(jù)庫(kù)內(nèi)部的用戶名、密碼、數(shù)據(jù)庫(kù)地址。那我們?nèi)绾巫龅綄⒎?wù)內(nèi)部的權(quán)限與 IAM 權(quán)限體系進(jìn)行整合呢?
參考架構(gòu)設(shè)計(jì)藍(lán)圖
理論上安全服務(wù)的后臺(tái)架構(gòu)很少討論,因?yàn)槔锩鏁?huì)透露很多部署與編碼的方式,有可能會(huì)暴露安全隱患;但我們這個(gè)服務(wù)采用了無(wú)服務(wù)器架構(gòu)設(shè)計(jì),這個(gè)設(shè)計(jì)本身暴露在外的都是 AWS 提供的托管服務(wù),這些服務(wù)的安全性 AWS 會(huì)提供保障;而我們這里不會(huì)討論后端代碼。
我們前面演示的后臺(tái)服務(wù)完全采用了無(wú)服務(wù)器的方式:
Amazon API Gateway 進(jìn)行客戶接入與授權(quán)
AWS Lambda 調(diào)度運(yùn)行環(huán)境
Amazon DynamoDB 提供加密存儲(chǔ)
Amazon CloudWatch 提供 Metric 和日志收集
托管的 Amazon ES 服務(wù)提供日志分析與展現(xiàn)
Amazon IAM 模塊提供用戶認(rèn)證與授權(quán)
服務(wù)本身的設(shè)計(jì)也已經(jīng)考慮了多租戶、多服務(wù)、多用戶等授權(quán)場(chǎng)景。
篇幅所限,我們僅描述一下服務(wù)里涉及到的一個(gè)流程。這個(gè)流程中會(huì)涉及到客戶的 AWS 賬戶(A)與安全服務(wù)的 AWS 賬戶(B),通過(guò)這個(gè)流程,客戶應(yīng)用將完成授權(quán)到鏈接的過(guò)程。
在客戶賬戶 A 中
1
需要訪問(wèn)數(shù)據(jù)庫(kù)的軟件 APP,通過(guò) SDK 發(fā)起數(shù)據(jù)庫(kù)連接
2
SDK 通過(guò) IAM STS 服務(wù)從安全服務(wù)賬戶 B 中獲取 User Role 對(duì)應(yīng)的 token
3
SDK 將 Token 與查詢信息組合后,對(duì) API Gateway 進(jìn)行加密訪問(wèn)
安全服務(wù)賬戶 B 中
4
收到 SDK 提交的查詢請(qǐng)求,Amazon API Gateway 首先驗(yàn)證 Token 所對(duì)應(yīng)的 User Role 是否有相關(guān)權(quán)限
5
Amazon API Gateway 檢查無(wú)誤后,會(huì)調(diào)用 Lambda 請(qǐng)求;AWS Lamdba 會(huì)從 Amazon API Gateway 獲取訪問(wèn)的 User Role ,然后在 Amazon DynamoDB 表中找到 User Role 對(duì)應(yīng)的用戶名、密碼、服務(wù)等信息,通過(guò) Amazon API Gateway 并返回給 SDK 。
在客戶賬戶 A 中
6
SDK 拿到所需信息,與數(shù)據(jù)庫(kù)服務(wù)創(chuàng)建連接,并返回給用戶代碼 APP
客戶需要進(jìn)行合理的授權(quán)行為,即通過(guò) Role 的方式對(duì) SDK 進(jìn)行授權(quán)。同時(shí)授權(quán)或非法訪問(wèn)日志均會(huì)被 Amazon IAM 與 Amazon API Gateway 記錄并匯總到 Amazon CloudWatch 與 Amazon ES 中,除了審計(jì)外,還可以定義事件流,偵測(cè)非法訪問(wèn)的地址并進(jìn)行屏蔽。
作為安全方案,無(wú)服務(wù)器架構(gòu)有幾個(gè)突出的安全相關(guān)的優(yōu)勢(shì):
· 對(duì)外只暴露受控的 API。
· 運(yùn)行環(huán)境是 Session 獨(dú)占且是及時(shí)銷毀。
· 在持久層 Amazon DynamoDB 也屬于無(wú)服務(wù)器架構(gòu);從存儲(chǔ)數(shù)據(jù)本身的安全性,到服務(wù)的訪問(wèn)控制,再到服務(wù)本身的設(shè)計(jì),Amazon DynamoDB 都采取了大量的安全機(jī)制。
· 無(wú)服務(wù)器架構(gòu)設(shè)計(jì)里面會(huì)使用很多 AWS 提供的托管服務(wù),上面已經(jīng)介紹過(guò) AWS 會(huì)對(duì)這些服務(wù)本身的安全性和可用性提供保障。
除了這些明顯的優(yōu)勢(shì)外,我們?cè)谶@里采用 SaaS 服務(wù)的模式。把安全服務(wù)放在一個(gè)單獨(dú) AWS 賬戶中,通過(guò)對(duì)這個(gè)賬戶采用最嚴(yán)格的審計(jì)和控制來(lái)提高服務(wù)的安全性。
無(wú)服務(wù)器的架構(gòu)同時(shí)還可以提供良好線性的擴(kuò)展能力,無(wú)論小型企業(yè)還是大型企業(yè),甚至可以用來(lái)提供安全類的 SaaS 服務(wù)。
為了驗(yàn)證我們這個(gè)方案的可擴(kuò)展性,這里進(jìn)行了一個(gè)簡(jiǎn)單的壓力測(cè)試。測(cè)試持續(xù)了 15 分鐘,壓力保持在 800TPS。這個(gè)過(guò)程中 0 異常,并且 99% 的端到端相應(yīng)時(shí)間均小于 1 秒,服務(wù)內(nèi)部的延遲在幾十毫秒。無(wú)服務(wù)器架構(gòu)的服務(wù)擴(kuò)展性非常出色。
任何一個(gè) SaaS 服務(wù)都不能脫離成本考量,安全密碼服務(wù)的使用性質(zhì)決定了服務(wù)很有可能會(huì)長(zhǎng)時(shí)間保持靜默,而在維護(hù)窗口被集中調(diào)用。采用無(wú)服務(wù)器架構(gòu)可以消滅 Idle 的成本,也可以消滅擴(kuò)展的等待窗口。無(wú)論存儲(chǔ)和計(jì)算都是按訪問(wèn)量計(jì)費(fèi),如果未來(lái)考慮做成 SaaS 服務(wù),這樣的特性也非常利于多租戶賬單的生成。
另外容易被忽視的成本來(lái)自研發(fā)投資。大量服務(wù)的采用,我們只需要對(duì)服務(wù)進(jìn)行簡(jiǎn)單的配置;AWS 還提供了 Serverless Application Repository,可以在里面找到很多編程范式。剩下只需關(guān)注于業(yè)務(wù)邏輯相關(guān)的代碼,AWS Lambda 保證了我們可以選擇自己擅長(zhǎng)的編程語(yǔ)言。上面的這個(gè)演示僅用了幾個(gè)小時(shí)時(shí)間采用 Node.js 與 Python 實(shí)現(xiàn);而且從 protyping 到 production 我們只需要細(xì)致打磨這個(gè)概念原型,不需要進(jìn)行復(fù)雜的擴(kuò)展性、可靠性、安全性方面的代碼重構(gòu)與優(yōu)化,這些都可以交給無(wú)服務(wù)器架構(gòu)來(lái)解決。
合作伙伴產(chǎn)品推薦
一般文章講到最后,總是要安利一款產(chǎn)品,然而我們這次要安利不止一款產(chǎn)品。
在 AWS 這個(gè)豐富的技術(shù)生態(tài)下,幾乎所有需求都會(huì)有小伙伴提供相關(guān)服務(wù),我們看到的這個(gè)需求當(dāng)然也不例外。
· AWS Secrets Manager,這是 AWS 的新服務(wù)??蓭椭Wo(hù)訪問(wèn)您的應(yīng)用程序、服務(wù)和 IT 資源所需的私密信息。該服務(wù)使您能夠輕松地跨整個(gè)生命周期輪換、管理和檢索數(shù)據(jù)庫(kù)憑證、API 密鑰和其他密鑰。用戶和應(yīng)用程序通過(guò)調(diào)用 Secrets Manager API 來(lái)檢索密鑰,無(wú)需對(duì)純文本的敏感信息進(jìn)行硬編碼。AWS Secrets Manager 通過(guò)適用于 Amazon RDS for MySQL、PostgreSQL 和 Amazon Aurora 的內(nèi)置集成實(shí)現(xiàn)密鑰輪換。此外,該服務(wù)還可以擴(kuò)展到其他類型的密鑰,包括 API 密鑰和 OAuth 令牌。此外,AWS Secrets Manager 使您可以利用細(xì)粒度的權(quán)限控制對(duì)私密信息的訪問(wèn),并集中審計(jì) AWS Cloud、第三方服務(wù)和本地資源的私密信息輪換。如果您使用的區(qū)域已經(jīng)有 AWS Secret Manager 服務(wù),那么我們強(qiáng)烈建議您嘗試一下這個(gè)由 AWS 提供安全保障的安全服務(wù)。
· AWS 高級(jí)技術(shù)合作伙伴 Hashicorp 也推出了一款產(chǎn)品 Vault Enterprise,不但可以解決安全信息管理的問(wèn)題,同時(shí)還提供了非常多的高級(jí)功能,包括 Encryption as services、HSM 集成、KMS 集成、MFA、服務(wù)容災(zāi)等等。
本文中的演示將被貢獻(xiàn)給 AWS 創(chuàng)新中心。 AWS 創(chuàng)新中心旨在通過(guò)科技創(chuàng)新的演示,向客戶集中展示 AWS 豐富的工具、服務(wù)和解決方案資源。借助多媒體、高科技的手段模擬現(xiàn)實(shí)環(huán)境,為客戶帶來(lái)全新的 AWS 云計(jì)算體驗(yàn),幫助客戶深入了解如何實(shí)現(xiàn)IT轉(zhuǎn)型及業(yè)務(wù)模式的創(chuàng)新,并取得成功。
目前 AWS 創(chuàng)新中心北京/上海/成都分中心均已開放。很多有創(chuàng)意的演示,例如:面部識(shí)別、合理規(guī)劃配置云實(shí)例、數(shù)據(jù)湖、數(shù)據(jù)庫(kù)遷移工具等。您可以聯(lián)系與您對(duì)接的 AWS 業(yè)務(wù)代表來(lái)參觀創(chuàng)新中心,期待您的光臨。
聯(lián)系客服