Tôi có một số kiến trúc microservice ít nhiều phức tạp, trong đó Apache Ignite được sử dụng làm cơ sở dữ liệu/bộ đệm không trạng thái. Đánh lửa vỏ
là duy nhất vỏ
trong nó không gian tên
và kiến trúc phải vượt qua kiểm tra bảo mật, nó sẽ không vượt qua nếu tôi không áp dụng các biện pháp hạn chế nhất Chính sách mạng
có thể cho đi ra
giao thông đường bộ. Nó phải hạn chế tất cả lưu lượng truy cập có thể không cần thiết bởi chính Ignite.
Lúc đầu, tôi nghĩ: Tốt, Ignite không đẩy bất kỳ lưu lượng truy cập nào sang người khác vỏ
s (không có nhóm nào khác trong đó không gian tên
), vì vậy điều này sẽ dễ dàng thực hiện khi hạn chế tất cả đi ra
giao thông trong không gian tên
nơi Ignite là duy nhất vỏ
! ...
Chà, điều đó không thực sự diễn ra tốt đẹp:
Không tí nào đi ra
quy tắc, ngay cả khi tôi cho phép lưu lượng truy cập vào tất cả các cổng được đề cập trong Tài liệu Ignite, sẽ khiến khởi động không thành công với lỗi Đốt cháySpiException
điều đó nói Không thể truy xuất địa chỉ IP nhóm Ignite, Gây ra bởi: java.net.ConnectException: Thao tác đã hết thời gian (Đã hết thời gian kết nối)
.
Vấn đề dường như là TcpDiscoveryKubernetsIp Downloader
, đặc biệt là phương pháp getRegisteredAddresses(...)
mà rõ ràng là có một số lưu lượng đi ra bên trong không gian tên
để đăng ký địa chỉ IP của các nút Ignite. Tất nhiên, cổng disory 47500 được cho phép, nhưng điều đó không thay đổi được tình hình. Các chức năng của Ignite với khác vỏ
s từ khác không gian tên
s đang hoạt động mà không có đi ra
các quy tắc được áp dụng, có nghĩa là (với tôi) rằng cấu hình liên quan đến CụmVai trò
, CụmVai tròRàng buộc
, một Dịch vụ
bên trong không gian tên
và cấu hình xml của chính Ignite, v.v. có vẻ đúng. Thậm chí xâm nhập
các quy tắc hạn chế lưu lượng truy cập từ các không gian tên khác đang hoạt động như mong đợi, cho phép chính xác lưu lượng truy cập mong muốn.
Đây là những chính sách tôi đã áp dụng:
[ĐANG LÀM VIỆC, chỉ chặn lưu lượng truy cập không mong muốn]:
## Từ chối tất cả lưu lượng truy cập vào tất cả các Nhóm trong Không gian tên
apiVersion: mạng.k8s.io/v1
loại: NetworkPolicy
metadata:
tên: từ chối-tất cả-ingress-in-cache-ns
không gian tên: cache-ns
thông số kỹ thuật:
# không chọn gì ở đây sẽ từ chối tất cả lưu lượng truy cập giữa các nhóm trong không gian tên
podSelector:
matchLabels: {}
# các tuyến giao thông được xem xét, tại đây: độc quyền đến
loại chính sách:
- Xâm nhập
## Cho phép lưu lượng truy cập cần thiết
apiVersion: mạng.k8s.io/v1
loại: NetworkPolicy
metadata:
tên: netpol-cache-ns
không gian tên: cache-ns
# xác định (các) nhóm mà chính sách này đang nhắm mục tiêu
thông số kỹ thuật:
loại chính sách:
- Xâm nhập
podSelector:
trận đấuNhãn:
ứng dụng: đốt cháy
# <----lưu lượng truy cập đến----
xâm nhập:
- từ:
- không gian tênSelector:
trận đấuNhãn:
khu vực: nơi khác
podSelector:
matchExpressions:
- phím: ứng dụng
toán tử: Trong
giá trị: [some-pod, another-pod] # tên giả, những Pod này không thành vấn đề gì cả
cổng:
- cổng: 11211 # JDBC
giao thức: TCP
- cổng: 47100# giao tiếp SPI
giao thức: TCP
- cổng: 47500 # Khám phá SPI (TIÊU CHUẨN, rất có thể ...)
giao thức: TCP
- cổng: 10800 # SQL
giao thức: TCP
# ---- lưu lượng gửi đi ---->
# KHÔNG CÓ TẤT CẢ
Với hai điều này được áp dụng, mọi thứ đều hoạt động tốt, nhưng kiểm tra bảo mật sẽ nói điều gì đó như
Đâu là những hạn chế cho đi ra
? Điều gì sẽ xảy ra nếu nút này bị tấn công thông qua các tuyến được phép vì một trong các Nhóm sử dụng các tuyến này đã bị tấn công trước đó? Nó có thể gọi một máy chủ C&C sau đó! Cấu hình này sẽ không được phép, hãy làm cứng kiến trúc của bạn!
[CHẶN lưu lượng truy cập mong muốn/cần thiết]:
Nói chung từ chối tất cả lưu lượng truy cập ...
## Từ chối tất cả lưu lượng truy cập vào tất cả các Nhóm trong Không gian tên
apiVersion: mạng.k8s.io/v1
loại: NetworkPolicy
metadata:
tên: từ chối tất cả lưu lượng truy cập trong bộ đệm-ns
không gian tên: cache-ns
thông số kỹ thuật:
# không chọn gì ở đây sẽ từ chối tất cả lưu lượng truy cập giữa các nhóm trong không gian tên
podSelector:
matchLabels: {}
# các tuyến giao thông được xem xét, tại đây: độc quyền đến
loại chính sách:
- Xâm nhập
- Egress # <------ ĐÂY LÀ SỰ KHÁC BIỆT SO VỚI CÔNG VIỆC TRÊN
... và cho phép các tuyến đường cụ thể sau đó
apiVersion: mạng.k8s.io/v1
loại: NetworkPolicy
metadata:
tên: netpol-cache-ns-egress
không gian tên: cache-ns
# xác định (các) nhóm mà chính sách này đang nhắm mục tiêu
thông số kỹ thuật:
loại chính sách:
- Đi ra
podSelector:
trận đấuNhãn:
ứng dụng: đốt cháy
---- lưu lượng đi ---->
đi ra:
# [KHÔNG ĐỦ]
# cho phép đi ra không gian tên này tại các cổng cụ thể
- đến:
- không gian tênSelector:
trận đấuNhãn:
vùng: vùng đệm
cổng:
- giao thức: TCP
cổng: 10800
- giao thức: TCP
cổng: 47100 # giao tiếp SPI
- giao thức: TCP
cổng: 47500
# [KHÔNG ĐỦ]
# cho phép phân giải dns nói chung (không giới hạn không gian tên hoặc nhóm)
- cổng:
- giao thức: TCP
cổng: 53
- giao thức: UDP
cổng: 53
# [KHÔNG ĐỦ]
# cho phép đi ra hệ thống kube (đã có nhãn!)
- đến:
- không gian tênSelector:
trận đấuNhãn:
vùng: hệ thống kube
# [KHÔNG ĐỦ]
# cho phép đi ra trong không gian tên này và cho nhóm đánh lửa
- đến:
- không gian tênSelector:
trận đấuNhãn:
vùng: vùng đệm
podSelector:
trận đấuNhãn:
ứng dụng: đốt cháy
# [KHÔNG ĐỦ]
# cho phép lưu lượng truy cập đến địa chỉ IP của nhóm đánh lửa
- đến:
- ipBlock:
cidr: 172.21.70.49/32 # sẽ không hoạt động tốt vì các địa chỉ đó là địa chỉ động
cổng:
- cổng: 11211 # JDBC
giao thức: TCP
- cổng: 47100# giao tiếp SPI
giao thức: TCP
- cổng: 47500 # Khám phá SPI (TIÊU CHUẨN, rất có thể ...)
giao thức: TCP
- cổng: 49112 # JMX
giao thức: TCP
- cổng: 10800 # SQL
giao thức: TCP
- cổng: 8080 # REST
giao thức: TCP
- cổng: 10900 # máy khách mỏng
giao thức: TCP
Phiên bản Apache Ignite được sử dụng là 2.10.0
Bây giờ câu hỏi cho tất cả độc giả là:
Làm thế nào tôi có thể hạn chế Đi ra
đến mức tối thiểu tuyệt đối bên trong không gian tên
để Ignite khởi động và hoạt động chính xác? Liệu nó có đủ để chỉ từ chối Đi ra
ra ngoài cụm?
Nếu bạn cần thêm khoai mỡ
Đối với một phỏng đoán hoặc gợi ý có giáo dục, xin vui lòng yêu cầu họ trong một nhận xét.
Và xin lỗi vì đã gắn thẻ nếu nó có vẻ không phù hợp, tôi không thể tìm thấy thẻ kubernetes-networkpolicy
vì nó hiện diện trên stackoverflow.
CẬP NHẬT:
thi hành nslookup -debug kubernetes.default.svc.cluster.local
từ bên trong nhóm đánh lửa mà không có bất kỳ chính sách nào hạn chế đi ra
trình diễn
BusyBox v1.29.3 (24/01/2019 07:45:07 UTC) nhị phân đa cuộc gọi.
Cách sử dụng: nslookup HOST [DNS_SERVER]
Truy vấn DNS về HOST
Ngay khi (bất kỳ) Chính sách mạng
được áp dụng hạn chế Đi ra
đến các cổng, nhóm và không gian tên cụ thể, nhóm Ignite từ chối khởi động và tra cứu không đến được kubernetes.default.svc.cluster.local
nữa không.
Đi ra
đến DNS đã được cho phép (UDP 53 đến ứng dụng k8s: kube-dns) â vẫn không thể tra cứu ip