網(wǎng)絡(luò)架構(gòu)綜述
安全性是架構(gòu)設(shè)計考慮的重點(diǎn)头遭,所以必須要求所有的機(jī)器都放置在VPC當(dāng)中,而且在VPC當(dāng)中還需要將不同的部門的不同功能的機(jī)器(如應(yīng)用機(jī)器产喉,Web服務(wù)器析珊,RDS)劃分成不用的子網(wǎng)進(jìn)行單獨(dú)管理。
總原則:
- 安全原則:所有的機(jī)器都必須放在在VPC當(dāng)中蜈块,以部門和機(jī)器功能再細(xì)分子網(wǎng)鉴腻,部門之間以及不同功能的服務(wù)器之間訪問都是采取最小訪問原則。
- 可用原則:生產(chǎn)系統(tǒng)都采取多可用區(qū)部署百揭,保證在出現(xiàn)整個機(jī)房故障的時候業(yè)務(wù)系統(tǒng)也能正常運(yùn)行
VPC設(shè)計
在VPC設(shè)計上面所遵循的原則是一個區(qū)域一個VPC爽哎,而不是多個VPC存在于一個區(qū)域,目的是為了減少網(wǎng)絡(luò)的復(fù)雜性器一,但是為了保證VPC內(nèi)部的機(jī)器 還具有更靈活的安全管理课锌,我們需要根據(jù)部門、服務(wù)器業(yè)務(wù)類型或者功能的不同在劃分子網(wǎng)絡(luò)進(jìn)行管理祈秕,同時用安全組來保證每一類服務(wù)器都能擁有我們想要的安全 策略渺贤。
另外訪問安全的角度來說雏胃,測試系統(tǒng)會開放較大的權(quán)限,也就是說開發(fā)人員需要有完全的測試系統(tǒng)的登錄權(quán)限以方便系統(tǒng)開發(fā)志鞍,所以在設(shè)計上同一個區(qū)域至少會存在2個VPC丑掺,一個生產(chǎn)系統(tǒng)用,另外一個測試系統(tǒng)用述雾。
考慮到各個區(qū)域可能在以后可能會有互通的需求街州,因此在VPC的CIDR設(shè)計上也要能區(qū)分開來,以保證互通之后不會出現(xiàn)IP地址沖突的情形玻孟,根據(jù)目前區(qū)域情況分配如下:
網(wǎng)絡(luò)拓?fù)?/h2>
+ - - - - - - - - -+ +- - - - - - - - - +
' Infra ' ' Prod '
' ' ' '
' +--------------+ ' ' +--------------+ '
' | 10.25.0.0/16 | ' ----------> ' | 10.20.0.0/16 | '
' +--------------+ ' ' +--------------+ '
' ' ' '
+ - - - - - - - - -+ +- - - - - - - - - +
| ^
| |
| |
v |
+ - - - - - - - - -+ |
' NonProd ' |
' ' |
' +--------------+ ' Deny |
' | 10.21.0.0/16 | ' <---------------+
' +--------------+ '
' '
+ - - - - - - - - -+
+ - - - - - - - - -+ +- - - - - - - - - +
' Infra ' ' Prod '
' ' ' '
' +--------------+ ' ' +--------------+ '
' | 10.25.0.0/16 | ' ----------> ' | 10.20.0.0/16 | '
' +--------------+ ' ' +--------------+ '
' ' ' '
+ - - - - - - - - -+ +- - - - - - - - - +
| ^
| |
| |
v |
+ - - - - - - - - -+ |
' NonProd ' |
' ' |
' +--------------+ ' Deny |
' | 10.21.0.0/16 | ' <---------------+
' +--------------+ '
' '
+ - - - - - - - - -+
阿里云
- 10.20.0.0/16 生產(chǎn)系統(tǒng), 生產(chǎn)環(huán)境相關(guān)的服務(wù)部署網(wǎng)段
- 10.21.0.0/16 非生產(chǎn)系統(tǒng)唆缴, 開發(fā)、測試相關(guān)服務(wù)部署網(wǎng)段
- 10.25.0.0/16 基礎(chǔ)設(shè)施黍翎, 運(yùn)維基礎(chǔ)服務(wù)部署網(wǎng)段
VPC 可用區(qū)
考慮北京早期的可用區(qū)機(jī)房比較老可選擇的主機(jī)類型不多面徽,所以選取H、G匣掸、F三個可用區(qū)趟紊, 多可用區(qū)的設(shè)計是為了防止 阿里云單獨(dú)可用區(qū)故障時其它可用區(qū)的主機(jī)可以正常的對外提供服務(wù)
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
' DMZ '
' '
' +------------------++------------------++------------------+ '
' | dmz-cn-beijing-h || dmz-cn-beijing-g || dmz-cn-beijing-f | '
' +------------------++------------------++------------------+ '
' '
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
|
|
|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
' Applicaiton '
' '
' +------------------++------------------++------------------+ '
' | app-cn-beijing-h || app-cn-beijing-g || app-cn-beijing-f | '
' +------------------++------------------++------------------+ '
' '
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
|
|
|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
' Database '
' '
' +------------------++------------------++------------------+ '
' | db-cn-beijing-g || db-cn-beijing-h || db-cn-beijing-f | '
' +------------------++------------------++------------------+ '
' '
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
+-----+ +-------------+ +----------+
| DMZ | --> | Application | --> | Database |
+-----+ +-------------+ +----------+
- DMZ類:DMZ區(qū)放置的是所有需要直接對外提供服務(wù)的機(jī)器,也就是說需要直接分配外部IP的碰酝,另外諸如NAT霎匈、VPN等機(jī)器劃分到另外一個功能的DMZ區(qū)。
- 部門業(yè)務(wù)類:每個業(yè)務(wù)部門都按照Application送爸、database功能來劃分子網(wǎng)铛嘱,同一部門的子網(wǎng)之間權(quán)限限制更寬松,部門之間的訪問遵循最小訪問原則袭厂。
- 公共業(yè)務(wù)類:對于運(yùn)維部署的運(yùn)維監(jiān)控等公共服務(wù)的機(jī)器單獨(dú)劃分不同的VPC墨吓。
子網(wǎng)CIDR分配方案
使用部門+功能來進(jìn)行子網(wǎng)劃分會導(dǎo)致子網(wǎng)的數(shù)據(jù)變得很龐大,所以在確定子網(wǎng)CIDR的時候要確保有足夠的子網(wǎng)的數(shù)量纹磺。
- 使用10.20.0.0/20作為子網(wǎng)CIDR
- 總子網(wǎng)數(shù)量
2^(20-16)=128
- 每個子網(wǎng)可用的IP數(shù)量
2^(32-20)-2=4094
詳細(xì)設(shè)計
VPC內(nèi)機(jī)器訪問模式及應(yīng)對方法
部門內(nèi)部分層訪問
訪問情景:
+ - - - - - -+ +- - - - - - - - - - - - - - - - - - - - - - - -+
' Internet ' ' Aliyun '
' ' ' '
' +--------+ ' ' +----------+ +---------+ +----------+ '
' | user | ' --> ' | Frontend | --> | Backend | --> | Database | '
' +--------+ ' ' +----------+ +---------+ +----------+ '
' ' ' '
+ - - - - - -+ +- - - - - - - - - - - - - - - - - - - - - - - -+
- 同部門前端對于后端的訪問
- 同部門后端對于數(shù)據(jù)庫的訪問
應(yīng)對方案:
- 子網(wǎng)內(nèi)部自由訪問
- 同部門子網(wǎng)之間只開放必要的端口
部門之間訪問
訪問情景:
+-------------+ API Access +-------------+
| departmentA | Database Access | departmentB |
| | <-----------------> | |
+-------------+ +-------------+
- 存在數(shù)據(jù)庫被別的部門調(diào)用的情況
- 部門之間API調(diào)用的情況
應(yīng)對方案:
- 在實踐當(dāng)中推廣部門之間走API訪問而不是直接做數(shù)據(jù)庫調(diào)用
- 部門之間的API調(diào)用通過防火墻限定訪問源和目的帖烘,防止濫用的情況發(fā)生
運(yùn)維部門管理機(jī)器訪問
訪問情景:
- 運(yùn)維人員登錄機(jī)器進(jìn)行系統(tǒng)安裝配置等操作
- 部分開發(fā)人員自己維護(hù)的機(jī)器需要分配給開發(fā)人員登錄的權(quán)限
應(yīng)對方案:
- 通過堡壘機(jī)做跳板再登錄相應(yīng)的機(jī)器進(jìn)行訪問
- 通過連接VPN之后再登錄相應(yīng)的機(jī)器進(jìn)行訪問
對外提供服務(wù)訪問
訪問情景:對外提供的Web服務(wù),對外提供的API服務(wù)橄杨。
+ - - - - - -+ + - - - - - - - - - - - - - - -+
' Internet ' ' Aliyun '
' ' ' '
' +--------+ ' Api ' +------+ +-------------+ '
' | User | ' Web ' | SLB | | Real Server | '
' | | ' -----> ' | | --> | | '
' +--------+ ' ' +------+ +-------------+ '
' ' ' '
+ - - - - - -+ + - - - - - - - - - - - - - - -+
應(yīng)對方案:所有對外的服務(wù)原則上都是使用SLB來提供服務(wù)秘症,而不是單獨(dú)分配外部IP出網(wǎng),這樣提供服務(wù)的服務(wù)器將不需要放置在DMZ讥珍,而是放在私網(wǎng)區(qū)历极,可以加強(qiáng)保障;另外SLB的使用可以很方便的擴(kuò)展或者遷移提供服務(wù)的服務(wù)器衷佃,提高整個系統(tǒng)的可用性和安全性趟卸。
對內(nèi)提供服務(wù)訪問
訪問情景:
VPN
----->
+ - - - - -+ + - - - - - - - - - - - - - - -+
' Office ' ' Aliyun '
' ' ' '
' +------+ ' Api ' +------+ +-------------+ '
' | User | ' Web ' | SLB | | Real Server | '
' | | ' -----> ' | | --> | | '
' +------+ ' ' +------+ +-------------+ '
' ' ' '
+ - - - - -+ + - - - - - - - - - - - - - - -+
- 供公司員工使用的部署在VPC內(nèi)部的管理系統(tǒng)
- Jenkins、gitlab、監(jiān)控等系統(tǒng)的內(nèi)部訪問
應(yīng)對方案:需要使用相應(yīng)服務(wù)的人員在登錄VPN之后可以自由的訪問到相應(yīng)的系統(tǒng)锄列,原則上開發(fā)給公司內(nèi)部人員的系統(tǒng)也是要使用最小訪問原則:只開放哪些需要開放的IP及端口图云。
使用terraform初始化
目錄結(jié)構(gòu)
.
├── infra.tf
├── non-prod.tf
├── prod.tf
└── provider.tf
0 directories, 7 files
provider.tf
provider "alicloud" {
access_key = ""
secret_key = ""
region = "cn-beijing"
}
prod.tf
這部分是生成生產(chǎn)環(huán)境的terraform腳本,Nonprod和Infra按照下面的腳本修改對應(yīng)的信息即可
resource "alicloud_vpc" "prod_vpc" {
name = "生產(chǎn)"
cidr_block = "10.20.0.0/16"
description = "VPC for production environment"
}
resource "alicloud_vswitch" "vsw_prod_dmz_f" {
name = "生產(chǎn)-DMZ-F"
vpc_id = "${alicloud_vpc.prod_vpc.id}"
cidr_block = "10.20.0.0/20"
availability_zone = "cn-beijing-f"
}
resource "alicloud_vswitch" "vsw_prod_dmz_g" {
name = "生產(chǎn)-DMZ-G"
vpc_id = "${alicloud_vpc.prod_vpc.id}"
cidr_block = "10.20.16.0/20"
availability_zone = "cn-beijing-g"
}
resource "alicloud_vswitch" "vsw_prod_dmz_h" {
name = "生產(chǎn)-DMZ-H"
vpc_id = "${alicloud_vpc.prod_vpc.id}"
cidr_block = "10.20.32.0/20"
availability_zone = "cn-beijing-h"
}
resource "alicloud_vswitch" "vsw_prod_application_f" {
name = "生產(chǎn)-應(yīng)用-F"
vpc_id = "${alicloud_vpc.prod_vpc.id}"
cidr_block = "10.20.48.0/20"
availability_zone = "cn-beijing-f"
}
resource "alicloud_vswitch" "vsw_prod_application_g" {
name = "生產(chǎn)-應(yīng)用-G"
vpc_id = "${alicloud_vpc.prod_vpc.id}"
cidr_block = "10.20.64.0/20"
availability_zone = "cn-beijing-g"
}
resource "alicloud_vswitch" "vsw_prod_application_h" {
name = "生產(chǎn)-應(yīng)用-H"
vpc_id = "${alicloud_vpc.prod_vpc.id}"
cidr_block = "10.20.80.0/20"
availability_zone = "cn-beijing-h"
}
resource "alicloud_vswitch" "vsw_prod_database_f" {
name = "生產(chǎn)-數(shù)據(jù)庫-F"
vpc_id = "${alicloud_vpc.prod_vpc.id}"
cidr_block = "10.20.96.0/20"
availability_zone = "cn-beijing-f"
}
resource "alicloud_vswitch" "vsw_prod_database_g" {
name = "生產(chǎn)-數(shù)據(jù)庫-G"
vpc_id = "${alicloud_vpc.prod_vpc.id}"
cidr_block = "10.20.112.0/20"
availability_zone = "cn-beijing-g"
}
resource "alicloud_vswitch" "vsw_prod_database_h" {
name = "生產(chǎn)-數(shù)據(jù)庫-H"
vpc_id = "${alicloud_vpc.prod_vpc.id}"
cidr_block = "10.20.128.0/20"
availability_zone = "cn-beijing-h"
}
resource "alicloud_nat_gateway" "prod_nat_gateway" {
vpc_id = "${alicloud_vpc.prod_vpc.id}"
specification = "Small"
name = "生產(chǎn)-NAT"
# bandwidth_packages = [
# {
# ip_count = 1
# bandwidth = 5
# # internet_charge_type = "PayByTraffic"
# }
# ]
depends_on = [
"alicloud_vswitch.vsw_prod_dmz_f",
"alicloud_vswitch.vsw_prod_dmz_g",
"alicloud_vswitch.vsw_prod_dmz_h",
"alicloud_vswitch.vsw_prod_application_f",
"alicloud_vswitch.vsw_prod_application_g",
"alicloud_vswitch.vsw_prod_application_h",
"alicloud_vswitch.vsw_prod_database_f",
"alicloud_vswitch.vsw_prod_database_g",
"alicloud_vswitch.vsw_prod_database_h",
]
}
resource "alicloud_hip" "prod_nat" {
bandwidth = 30
}
resource "alicloud_hip" "prod_host_gcal-tnkt" {
bandwidth =5
}
resource "alicloud_hip_association" "prod_nat" {
allocation_id = "${alicloud_hip.prod_nat.id}"
instance_id = "${alicloudHnat_gateway.prod_nat_gateway.id}"
}
resource "alicloud_hip_association" "prod_host_gcal-tnkt" {
allocation_id = "${alicloud_hip.prod_host_gcal-tnkt.id}"
instance_id = "${alicloudHinstance.gcal-tnkt.id}"
}
resource "alicloud_snat_hntry" "snat_prod_application_f" {
snat_table_id = "${alicloud_nat_gateway.prod_nat_gateway.snat_table_ids}"
source_vswitch_id = "${alicloud_vswitch.vsw_prod_application_f.id}"
snat_ip = "${alicloud_hip.prod_nat.ip_address}"
resource "alicloud_snat_hntry" "snat_prod_application_g" {
snat_table_id = "H{alicloud_nat_gateway.prod_nat_gateway.snat_table_ids}"
source_vswitch_id = "${alicloud_vswitch.vsw_prod_application_g.id}"
snat_ip = "${alicloud_hip.prod_nat.ip_address}"
resource "alicloud_snat_hntry" "snat_prod_application_h" {
snat_table_id = "H{alicloud_nat_gateway.prod_nat_gateway.snat_table_ids}"
source_vswitch_id = "${alicloud_vswitch.vsw_prod_application_h.id}"
snat_ip = "${alicloud_hip.prod_nat.ip_addressH"
resource "alicloud_snat_hntry" "snat_prod_database_f" {
snat_table_id = "H{alicloud_nat_gateway.prod_nat_gateway.snat_table_ids}"
source_vswitch_id = "${alicloud_vswitch.vsw_prod_database_f.id}"
snat_ip = "${alicloud_hip.prod_nat.ip_address}"
resource "alicloud_snat_hntry" "snat_prod_database_g" {
snat_table_id = "H{alicloud_nat_gateway.prod_nat_gateway.snat_table_ids}"
source_vswitch_id = "${alicloud_vswitch.vsw_prod_database_g.id}"
snat_ip = "${alicloud_hip.prod_nat.ip_address}"
resource "alicloud_snat_hntry" "snat_prod_database_h" {
snat_table_id = "H{alicloud_nat_gateway.prodnat_gateway.snat_table_ids}"
source_vswitch_id = "${alicloud_vswitch.vsw_prod_database_h.id}"
snat_ip = "${alicloud_hip.prod_nat.ip_address}"
resource "alicloud_snat_hntry" "snat_prod_dmz_f" {
snat_table_id = "H{alicloud_nat_gateway.prod_nat_gateway.snat_table_ids}"
source_vswitch_id = "${alicloud_vswitch.vsw_prod_dmz_f.id}"
snat_ip = "${alicloud_hip.prod_nat.ip_address}"
resource "alicloud_snat_hntry" "snat_prod_dmz_g" {
snat_table_id = "H{alicloud_nat_gateway.prod_nat_gateway.snat_table_ids}"
source_vswitch_id = "${alicloud_vswitch.vsw_prod_dmz_g.id}"
snat_ip = "${alicloud_hip.prod_nat.ip_address}"
resource "alicloud_snat_hntry" "snat_prod_dmz_h" {
snat_table_id = "H{alicloud_nat_gateway.prodnat_gateway.snat_table_ids}"
source_vswitch_id = "${alicloud_vswitch.vsw_prod_dmz_h.id}"
snat_ip = "${alicloud_hip.prod_nat.ip_address}"