حمله‌ی محروم‌سازی از خدمت (Distributed Denial of Service) یا به اختصار DDoS با ارسال حجم بالایی از درخواست‌های مخرب از منابع مختلف، یک سرور یا شبکه را اشباع کرده و باعث اختلال یا توقف دسترسی کاربران واقعی به سرویس می‌شود. در این مستند به چند راهکار برای امن‌سازی زیرساخت کوبرنتیز در برابر این حمله می‌پردازیم. توجه کنید که امکان Private API Server کوبرنتیز ستون، یکی از مهم‌ترین راهکارهای جلوگیری از این حمله است اما اقدامات بیشتری نیز برای امنیت کلاستر کوبرنتیز، مورد نیاز است.

حملات DDoS از نظر نوع و لایه‌ی شبکه‌ای حمله، متنوع هستند در نتیجه بنا به اصل امنیتی دفاع در عمق (Defense in Depth) نیاز است در لایه‌های مختلفی برای مقابله با آن‌ها اقدام لازم انجام شود.

  • لیست IPهای کدهای این مستند، صرفا جهت مثال است و از لینک‌های داده‌شده آن‌ها را بازبینی و به روزرسانی کنید.
  • برای دریافت لیست IP لبه‌های CDN ستون می‌توانید به این لینک مراجعه کنید یا با پشتیبانی ستون تماس بگیرید.

راهکار ۱ - امن‌سازی در لایه‌ی اپلیکیشن (L7) با استفاده از Ingress White-list

توصیه می‌شود حتما سرویس‌های کوبرنتیز را از طریق CDN ستون در دسترس کاربران قرار دهید تا از امکانات امنیتی CDN مثل دیواره‌ی آتش برای مقابله با حملات DDoS بهرمند شوید. برای این کار نیاز است در Ingress های کلاستر کوبرنتیز، فقط سرورهای لبه‌ی CDN را White-list نمایید. مثلا در ingress-nginx با انوتیشن nginx.ingress.kubernetes.io/whitelist-source-range این کار انجام می‌شود. همچنین در مورد امن‌سازی CDN در برابر حملات مختلف می‌توانید به مستند CDN Firewall ستون مراجعه کنید.

مقدار Pod CIDR در کوبرنتیز ستون به طور پیش‌فرض 10.232.64.0/18 است و Service CIDR آن 10.96.0.0/12 است مگر آن که قبل از ساخت کلاستر درخواست تغییر آن را داده باشید. مقدار Subnet CIDR را نیز می‌توانید از طریق پنل کوبرنیتز ستون مشاهده نمایید.

در صورت داشتن ابهام در مقادیر CIDR مورد نظر، می‌توانید با پشتیبانی ستون تماس بگیرید چرا که تنظیم مقادیر خطا ممکن است دسترسی به سرویس مورد نظر را قطع کند.

kubectl annotate --namespace INGRESS_NAMESPACE ingress INGRESS_NAME nginx.ingress.kubernetes.io/whitelist-source-range="<POD_CIDR>,<SUBNET_CIDR>,<CDN_EDGES>,<TRUSTED_EXTERNAL_RANGES>"

راهکار ۲ - امن‌سازی در لایه‌ی شبکه (L3) با استفاده از NetworkPolicy

می‌دانیم بعضی از حملات DoS در لایه‌های پایین‌تر مانند TCP و IP انجام می‌شود. پلاگین نتورک کوبرنتیز ستون (Calico) می‌تواند از طریق تنظیم قوانین iptables روی ماشین‌های Worker، در لایه‌ی Network و Transport از ورود ترافیک غیر امن، جلوگیری کند. توجه کنید که در کد نمونه‌ی زیر حتما باید PodCIDR و ServiceCIDR و آی پی‌های Subnet کلاستر و هر IP دیگری که ترافیک مجاز به کلاستر دارد مثل IPهای سرورهای لبه‌ی CDN، مجاز شود. توجه کنید که podSelector مثال زیر، همه‌ی پادهای Namespace مورد نظر را شامل می‌شود. برای اطلاع بیشتر می‌توانید به مستند NetworkPolicy کوبرنتیز مراجعه نمایید.

kubectl apply -n INGRESS_NAMESPACE -f restrict-ingress-traffic.yaml
# restrict-ingress-traffic.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
 name: restrict-ingress-traffic
 namespace: <INGRESS_NAMESPACE>
spec:
 podSelector: {}
 ingress:
   - from:
       - ipBlock:
           cidr: 10.232.64.0/18 # POD CIDR
       - ipBlock:
           cidr: 10.96.0.0/12 # SERVCIE CIDR
       - ipBlock:
           cidr: 10.0.0.0/24 # SUBNET CIDR
         # CDN IP RANGE
       - ipBlock:
           cidr: 185.166.104.0/24
       - ipBlock:
           cidr: 194.34.163.0/24
       - ipBlock:
           cidr: 79.175.140.0/28
       - ipBlock:
           cidr: 46.102.131.8/29
       - ipBlock:
           cidr: 185.3.127.8/29
       - ipBlock:
           cidr: 185.3.127.32/29
       - ipBlock:
           cidr: 89.45.48.59/32
       - ipBlock:
           cidr: 89.45.48.60/32
       - ipBlock:
           cidr: 89.45.48.61/32
       - ipBlock:
           cidr: 89.45.48.62/32
       - ipBlock:
           cidr: 164.138.128.23/32
       - ipBlock:
           cidr: 83.123.255.52/32
       - ipBlock:
           cidr: 185.191.78.86/32
       - ipBlock:
           cidr: 185.191.77.54/32
       - ipBlock:
           cidr: 185.191.79.142/32
       - ipBlock:
           cidr: 46.224.2.6/32
       - ipBlock:
           cidr: 46.224.2.7/32
       - ipBlock:
           cidr: 5.160.58.96/27
       - ipBlock:
           cidr: 5.160.246.206/32
       - ipBlock:
           cidr: 5.160.179.168/29
       - ipBlock:
           cidr: 188.0.240.40/29
       - ipBlock:
           cidr: 78.111.1.20/32
       - ipBlock:
           cidr: 78.111.1.15/32
       - ipBlock:
           cidr: 78.111.1.100/32
       - ipBlock:
           cidr: 78.111.5.0/24
       - ipBlock:
           cidr: 185.59.223.139/32
       - ipBlock:
           cidr: 89.187.185.169/32
       - ipBlock:
           cidr: 185.229.191.85/32
       - ipBlock:
           cidr: 89.187.169.73/32
       - ipBlock:
           cidr: 2.144.3.160/28
       - ipBlock:
           cidr: 194.34.162.150/32
       - ipBlock:
           cidr: 185.137.26.48/30
       - ipBlock:
           cidr: 185.137.26.52/30
       - ipBlock:
           cidr: 185.137.26.56/30
       - ipBlock:
           cidr: 46.102.142.0/24
       - ipBlock:
           cidr: 87.247.173.162/32
       - ipBlock:
           cidr: 87.247.173.163/32
       - ipBlock:
           cidr: 87.247.173.164/32
       - ipBlock:
           cidr: 79.127.221.34/32
       - ipBlock:
           cidr: 31.214.250.40/29
       - ipBlock:
           cidr: 164.138.129.48/28
       - ipBlock:
           cidr: 185.229.191.64/26
       - ipBlock:
           cidr: 185.59.223.128/26
       - ipBlock:
           cidr: 79.127.196.0/26
       - ipBlock:
           cidr: 121.127.46.128/26
       - ipBlock:
           cidr: 89.187.185.64/26
       - ipBlock:
           cidr: 185.254.199.62/32
       - ipBlock:
           cidr: 195.26.87.101/32
       - ipBlock:
           cidr: 78.111.6.144/29

پیوست - امن‌سازی APISIX Ingress

در Ingressهای دیگر مانند Apache APISIX نیز این امکان وجود دارد، مثلا برای تنظیم IPهای لبه در این ابزار، می‌توانید مشابه زیر عمل کنید.

apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
  name: example
  namespace: example-ns
spec:
  http:
  - backends:
    - serviceName: example
      servicePort: 3000
    match:
      hosts:
      - example.com
      paths:
      - /*
    name: example
    plugins:
    - config:
        whitelist:
        - 185.166.104.0/24
        - 194.34.163.0/24
        - 79.175.140.0/28
        - 46.102.131.8/29
        - 185.3.127.8/29
        - 185.3.127.32/29
        - 89.45.48.59/32
        - 89.45.48.60/32
        - 89.45.48.61/32
        - 89.45.48.62/32
        - 164.138.128.23/32
        - 83.123.255.52/32
        - 185.191.78.86/32
        - 185.191.77.54/32
        - 185.191.79.142/32
        - 46.224.2.6/32
        - 46.224.2.7/32
        - 5.160.58.96/27
        - 5.160.246.206/32
        - 5.160.179.168/29
        - 188.0.240.40/29
        - 78.111.1.20/32
        - 78.111.1.15/32
        - 78.111.1.100/32
        - 78.111.5.0/24
        - 185.59.223.139/32
        - 89.187.185.169/32
        - 185.229.191.85/32
        - 89.187.169.73/32
        - 2.144.3.160/28
        - 194.34.162.150/32
        - 185.137.26.48/30
        - 185.137.26.52/30
        - 185.137.26.56/30
        - 46.102.142.0/24
        - 87.247.173.162/32
        - 87.247.173.163/32
        - 87.247.173.164/32
        - 79.127.221.34/32
        - 31.214.250.40/29
        - 164.138.129.48/28
        - 185.229.191.64/26
        - 185.59.223.128/26
        - 79.127.196.0/26
        - 121.127.46.128/26
        - 89.187.185.64/26
        - 185.254.199.62/32
        - 195.26.87.101/32
        - 78.111.6.144/29
      enable: true
      name: ip-restriction
    priority: 2