Score:0

{âstatusâ:400,âmessageâ:âBad requestâ} เมื่อโจมตีไมโครเซอร์วิสโดยใช้ Nginx API Gateway

ธง us

สวัสดี ฉันกำลังพยายามใช้ API โดยใช้เกตเวย์ Nginx API: ฉันมี URL นี้: example.com/api/nodeapp ในการตั้งค่าของฉัน ฉันมีตัวควบคุม Ingress ซึ่งเปิดเผยภายนอกที่ .com และรับคำขอทำ oauth และเปลี่ยนเส้นทางไปยังพ็อด nginx ภายใน (แสดงเป็นบริการ IP ของคลัสเตอร์ในคลัสเตอร์ส่วนตัว) พ็อด nginx ภายในนี้จะเปลี่ยนเส้นทางไปยังพ็อด microservice เป้าหมาย ( ยังเปิดเผยเป็นบริการ Cluster IP ในคลัสเตอร์ส่วนตัวเดียวกัน) เป้าหมาย: ฉันเรียกดู url เป็น example.com/api/nodeapp ---> Ingress จะทำ oauth และเปลี่ยนเส้นทางคำขอไปยัง Nginx (ซึ่งปกติดี) Nginx รับคำขอของฉันและเปลี่ยนเส้นทางฉันไปยัง microservice nodeapp เป้าหมาย (ซึ่งล้มเหลวที่ ข้อผิดพลาด 400) ข้อมูลโค้ดของฉัน:

Ingress.yaml

ข้อมูลจำเพาะ:
  กฎ:
    - โฮสต์: example.com
      http:
        เส้นทาง:
          - เส้นทาง: /api/nodeapp
            แบ็กเอนด์:
              ชื่อบริการ: nginx-internal-service
              พอร์ตบริการ: 80
          - เส้นทาง: /api/tea
            แบ็กเอนด์:
              ชื่อบริการ: nginx-internal-service
              พอร์ตบริการ: 80

Nginx.conf

ผู้ใช้ nginx;
worker_processes อัตโนมัติ

error_log /var/log/nginx/error.log ดีบัก;
pid /var/run/nginx.pid;


เหตุการณ์ {
    worker_connections 1024;
}


http {
    รวม /etc/nginx/mime.types;
    แอปพลิเคชัน default_type/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request"'
                      '$สถานะ $body_bytes_sent "$http_referer"'
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log หลัก;

    ส่งไฟล์บน;
    #tcp_nopush บน;

    keepalive_timeout 65;

    #gzip บน;
    รวม /etc/nginx/api_gateway.conf;
    รวม /etc/nginx/conf.d/*.conf;
}

api_gateway.conf

รวมถึง api_backends.conf;
#รวม api_keys.conf;

เซิร์ฟเวอร์ {
    access_log /var/log/nginx/api_access.log หลัก; # แต่ละ API อาจบันทึกไปยังไฟล์แยกต่างหาก

    ฟัง 80; # การกำหนดค่า TLS ไปที่นี่ (สำหรับการใช้งานจริง)
    server_name example.com;

    #การกำหนดค่า TLS
    #ssl_certificate /etc/ssl/certs/api.example.com.crt;
    #ssl_certificate_key /etc/ssl/private/api.example.com.key;
    #ssl_session_cache ที่แชร์:SSL:10m;
    #ssl_session_timeout 5 นาที;
    #ssl_ciphers สูง:!aNULL:!MD5;
    #ssl_โปรโตคอล TLSv1.2 TLSv1.3;
   # ทรัพยากรไม่ถูกต้อง
    ที่ตั้ง / {
        เขียนใหม่ ^ https://$host$request_uri ถาวร;
    }
    # คำจำกัดความของ API หนึ่งรายการต่อไฟล์
    รวม api_conf.d/*.conf;

    #ตอบผิด
    error_page 404 = @400; # เส้นทางที่ไม่ถูกต้องถือเป็นคำขอที่ไม่ถูกต้อง
    ที่ตั้ง @400 {
        ส่งคืน 400 '{"status":400,"message":"คำขอไม่ถูกต้อง"}\n';
    }
    เปิด proxy_intercept_errors; # อย่าส่งข้อผิดพลาดส่วนหลังไปยังไคลเอนต์
    รวม error_json.conf; # การตอบสนองข้อผิดพลาด JSON ที่เป็นมิตรกับไคลเอ็นต์ API
    แอปพลิเคชัน default_type/json; # หากไม่มีประเภทเนื้อหาให้ถือว่า JSON
}

nodeapi_simple.conf

# โหนด API
#
ตำแหน่ง /api/ {
    # การกำหนดค่านโยบายที่นี่ (การรับรองความถูกต้อง การจำกัดอัตรา การบันทึก และอื่นๆ...)
    #
    access_log /var/log/nginx/nodeapp_api.log หลัก;

    # การกำหนดเส้นทาง URI
    #
    สถานที่ /api/ชา {
        proxy_pass http://tea;
    }

    ตำแหน่ง /api/nodeapp {
        proxy_pass http://nodeapp;
    }

    กลับ 404; #จับทั้งหมด
}

# เสียงเรียกเข้า: ไวยากรณ์ = nginx

api_backend.conf

nodeapp ต้นน้ำ {
    โซน nodeapp 64k;
    เซิร์ฟเวอร์ nodeapp IP:8000;
    
    
}


ชาต้นน้ำ {
    โซนชา 64k;
    แอปเซิร์ฟเวอร์ Tea IP:80;
    
    
}



# เสียงเรียกเข้า: ไวยากรณ์ = nginx

เป้าหมายหลักของฉันที่นี่คือเรียกใช้ example.com/api/nodeapp เพื่อเรียกใช้ซึ่งไม่ทำงานแม้ว่าฉันจะทดสอบ nodeapp บน localhost แล้วว่ามันทำงานได้ดีสิ่งที่แปลกอีกอย่างคือแอปชานี้เป็นเพียงแอปตัวอย่างข้อความซึ่งทำงานเมื่อฉันกดในเบราว์เซอร์ด้วย URL example.com/api/tea มันใช้งานได้ [[1]: https://i.stack.imgur .com/3fP3k.png][1]s ต่อสแน็ปด้านล่าง:

นี่คือบันทึกของฉัน [1]: https://i.stack.imgur.com/jssnb.png][1] ฉันติดอยู่ที่ข้อผิดพลาดนี้ตั้งแต่ 3 วันจึงขอให้ทุกคนช่วยฉันในเรื่องนี้โดยเร็วที่สุด

Michael Hampton avatar
cz flag
คุณเขียนการกำหนดค่า nginx นี้หรือคัดลอกจากที่ไหนสักแห่งหรือไม่ แสดงให้เห็นอย่างชัดเจนว่า "400" ที่คุณได้รับนั้นเป็น 404 จากเซิร์ฟเวอร์ API ที่การกำหนดค่าของคุณเขียนใหม่เป็น 400 ด้วยเนื้อหาการตอบสนองเฉพาะนั้น คุณควรดูที่เซิร์ฟเวอร์ API ต่อไป
yash avatar
us flag
ฉันใช้การกำหนดค่า nginx จากบล็อก nginx "การปรับใช้ NGINX เป็นเกตเวย์ API ตอนที่ 1" และฉันทดสอบเซิร์ฟเวอร์ node api ด้วยทางเข้า nginx ภายนอก ตัวมันเองทำงานได้ดี (200) เช่นเดียวกับทุกครั้งที่ฉันกด example.com/node (โดยไม่ใช้ ของ nginx ภายใน) ฉันได้รับหน้าสำเร็จ แต่เมื่อฉันกด example.com/api/nodeapp (ผ่าน ingress และ nginx pod ภายใน) ฉันได้รับข้อผิดพลาด 400 นี้
yash avatar
us flag
ฉันได้เพิ่มบันทึกด้วยแม้ว่าจะไม่มีรายละเอียดมากนัก แต่นี่คือสิ่งที่ฉันได้รับเท่านั้น
yash avatar
us flag
คุณพูดถูก ฉันแสดงความคิดเห็นในบรรทัด "ข้อผิดพลาดหน้า 404 = @400 " และตอนนี้ฉันได้รับข้อผิดพลาด 404 แต่ไม่แน่ใจว่าต้องทำอย่างไรต่อไป
Michael Hampton avatar
cz flag
คุณตรวจสอบใบสมัครของคุณอีกครั้ง
yash avatar
us flag
ฉันตรวจสอบแอปพลิเคชันของฉันอีกครั้งภายในเซิร์ฟเวอร์ มันใช้งานได้จริง มีอยู่อย่างหนึ่งที่จับได้ มีบางอย่างผิดปกติกับ " proxy pass http://nodeip:nodeport" สิ่งที่ฉันทำคือฉันแสดงความคิดเห็นบรรทัดนี้ในตำแหน่ง /api/nodeapp {) บล็อก และ แทนที่จะใส่กลับ 200; จากนั้นทดสอบแอปของฉัน มันโดนที่ 200 ซึ่งหมายความว่ามีบางอย่างที่น่าสงสัยเกี่ยวกับพร็อกซีพาสที่ไม่สามารถกดแอปโหนดของฉันได้
yash avatar
us flag
มันใช้งานได้ ฉันเดาว่าตอนนี้ฉันต้องเพิ่ม / ที่ส่วนท้ายของ proxy pass proxy pass nodeip:nodeport แบบนี้ --> proxy pass nodeip:nodeport/
yash avatar
us flag
ปัญหาหนึ่งคือหากแอปพลิเคชันของฉันได้รับการกำหนดค่าในลักษณะที่คำขอของฉันอาจเป็นเช่น /api/nodeapp/something แล้วจะเปลี่ยนเส้นทาง URL นี้ไปยังหน้าเป้าหมายได้อย่างไร

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา