Score:1

ตั้งค่า nginx เพื่อต้องการเงื่อนไขบางประการของตำแหน่งสำหรับทั้งหมดยกเว้น IP ต้นทางที่กำหนด

ธง de

ฉันกำลังมองหาการตั้งค่าที่ฉันต้องการมีใบรับรองไคลเอนต์ SSL สำหรับ IP ต้นทางทั้งหมด ยกเว้น IP ต้นทางเดียว

ความคิดของฉันคือการตั้งค่า

 ssl_verify_client เป็นทางเลือก;

และเพื่อเพิ่มคำสั่ง if อย่างละเอียดให้กับสถานที่ อย่างไรก็ตามฉันไม่รู้ว่าจะเขียนคำสั่ง if ดังกล่าวอย่างไร

  # สิ่งนี้ต้องการใบรับรองไคลเอนต์ ssl สำหรับทุกสถานที่
  ที่ตั้ง / {
    ถ้า ($ssl_client_verify != "สำเร็จ") { 
       กลับ 403; 
    ...
  }

  # ตอนนี้จะเขียนอะไรเพื่อต้องการใบรับรอง ssl ยกเว้นว่า IP ต้นทางเป็นเช่น 1.2.3.4
  สถานที่ / สอง {
    ถ้า (?????) { 
       กลับ 403; 
    ...
  }

แก้ไข: ข้อมูลเพิ่มเติม

สวิตช์ ssl_verify_client ด้วยค่า ไม่จำเป็น บอกลูกค้าว่าสามารถทำได้ แต่ไม่ต้องส่งใบรับรองไคลเอ็นต์

ดังนั้นโดยการตรวจสอบตัวแปร $var_ssl_client_verify ฉันสามารถดูได้ว่ามีการแสดงใบรับรองไคลเอ็นต์และถูกต้องหรือไม่ (ความสำเร็จ) หรือไม่. กฎนี้จะใช้กับไคลเอนต์ทั้งหมดที่ไม่มี IP ต้นทางที่กำหนด สำหรับ IP ต้นทางเฉพาะ ฉันไม่ต้องการยืนยันใบรับรองไคลเอ็นต์

สิ่งที่ฉันต้องการคือสิ่งที่ชอบ

    ถ้า ($ssl_client_verify != "สำเร็จ" และ source_ip != 1.2.3.4 ) { 
       กลับ 403; 
    }

แก้ไข 2: ฉันเปลี่ยนชื่อเรื่องจาก ตั้งค่า nginx เพื่อต้องการใบรับรองไคลเอนต์สำหรับทั้งหมดยกเว้น IP ต้นทางที่กำหนด ถึง ตั้งค่า nginx เพื่อต้องการเงื่อนไขบางประการของตำแหน่งสำหรับทั้งหมดยกเว้น IP ต้นทางที่กำหนด เนื่องจากสิ่งที่ฉันกำลังดิ้นรนจริงๆ ไม่เกี่ยวข้องกับใบรับรองไคลเอ็นต์ แต่เป็นการรวมคำสั่ง if และการกรองแบบมีเงื่อนไขบนที่อยู่ IP ต้นทาง

us flag
การใช้ `if` ภายในสถานที่ไม่ทำงานอย่างที่คุณคาดหวัง: https://www.nginx.com/resources/wiki/start/topics/html/ifisevil/
Score:1
ธง sv

ไม่รองรับหลายเงื่อนไขใน Nginx สำหรับ ถ้า คำแถลง. ดังนั้น วิธีแก้ปัญหาและ IP ไคลเอนต์ได้รับการประเมินใน usecase ของเรา วิธีแก้ปัญหาอาจทำได้คล้ายกับวิธีสำเร็จที่ https://www.nginx.com/blog/rate-limiting-nginx/#Advanced-Configuration-Examples . โดยทั่วไปวิธีแก้ปัญหาจะเป็นดังนี้ ...

จำกัด ทางภูมิศาสตร์ $ {
    ค่าเริ่มต้น 1;
    1.2.3.4 0; #โปรดแทนที่ IP ตัวอย่างด้วย IP จริง
}

ssl_verify_client เป็นทางเลือก;
ssl_client_certificate /path/to/cert.pem;

แผนที่ $limit $limit_key {
    0 "ความสำเร็จ";
    1 $ssl_client_verify;
}

เซิร์ฟเวอร์ {
    # ... คำแนะนำอื่น ๆ
    ที่ตั้ง / {
        ถ้า ( $limit_key != 'สำเร็จ' ) { ส่งคืน 403; }
        # ... คำแนะนำอื่น ๆ
    }
}

โดยพื้นฐานแล้ว เรากำหนดค่า "SUCCESS" ให้กับตัวแปรสำหรับ IP เฉพาะ สำหรับ IP อื่นๆ เราจะกำหนดค่าจริงของ $ssl_client_verify.

คำตอบทางเลือก

ssl_verify_client เป็นทางเลือก;
ssl_client_certificate /path/to/cert.pem;
เซิร์ฟเวอร์ {
    # ... คำแนะนำอื่น ๆ
    
    # ค่าเริ่มต้นของ $variable คือมูลค่าที่แท้จริงของ $ssl_client_verify
    ตั้งค่าตัวแปร $ssl_client_verify;

    # ที่นี่เรากำหนด $variable ใหม่ด้วย "SUCCESS" สำหรับ IP เฉพาะของเรา
    # โปรดแทนที่ 1.2.3.4 ด้วย IP จริง
    ถ้า ( $remote_addr = "1.2.3.4" ) {
        ตั้งค่า $ตัวแปร "สำเร็จ";
    }

    ที่ตั้ง / {
        if ( $variable != 'SUCCESS' ) { ส่งคืน 403; }
        # ... คำแนะนำอื่น ๆ
    }
}
sv flag
@gelonida ขออภัยที่เข้าใจผิดคำถามของคุณในตอนแรก
gelonida avatar
de flag
ขอบคุณสำหรับคำตอบ. สิ่งนี้ควรทำงาน ดังนั้นแนวคิดคือการใช้ `geo` สำหรับการแมปที่อยู่ IP ต้นทาง คำสั่ง `map` เพื่อสร้างตัวแปรหนึ่งตัว ซึ่งสุดท้ายสามารถใช้ใน `if ( $variable != "SUCCESS") { return 403; }` เกี่ยวกับความเข้าใจผิดในเบื้องต้น. มันทำให้ฉันเขียนคำถามของฉันใหม่ (หวังว่าจะ) เป็นวิธีที่คลุมเครือน้อยลงและเป็นแบบทั่วไปมากขึ้น จะทำเครื่องหมายคำถามว่าตกลงทันทีที่ฉันมีโอกาสทดสอบในสภาพแวดล้อมของฉัน ในความเป็นจริงสถานการณ์ของฉันซับซ้อนกว่าเล็กน้อยเนื่องจากที่อยู่ IP จะถูกกำหนดผ่านโปรโตคอลพร็อกซี
sv flag
@gelonida คุณพูดถูก โปรดดูคำตอบที่อัปเดตซึ่งรวมถึงโซลูชันอื่น
gelonida avatar
de flag
คำตอบทางเลือกกำลังทำงานสำหรับฉัน ยังไม่ได้ลองอันแรกเลย
sv flag
ดีใจที่รู้ว่ามันได้ผล

โพสต์คำตอบ

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