แนวปฏิบัติที่เหมาะสมที่สุดสำหรับที่เก็บแพ็กเกจพร็อกซี


16

ฉันมีชุดของเซิร์ฟเวอร์ CentOS ในเครือข่ายองค์กรของฉัน เพื่อเหตุผลด้านความปลอดภัยเซิร์ฟเวอร์ส่วนใหญ่ไม่มีการเข้าถึงอินเทอร์เน็ตขาออกทั่วไปเว้นแต่จะเป็นข้อกำหนดการทำงานหลักสำหรับเซิร์ฟเวอร์

สิ่งนี้สร้างความท้าทายเมื่อฉันต้องการอัปเดตแพ็คเกจ สำหรับที่เก็บ yum ฉันกำลังทำมิเรอร์ repos ที่จำเป็นทั้งหมดจากอินเทอร์เน็ตและทำให้มิเรอร์มีอยู่ในอินทราเน็ต ฉันเก็บสำเนาของ repo แต่ละตัวในสภาพแวดล้อมทั้งห้าของเรา: dev, QA, การจัดเตรียมและศูนย์ข้อมูลการผลิตสองแห่ง

ขณะนี้ฉันไม่ได้แก้ปัญหาแพคเกจ repos ภาษาเฉพาะ เมื่อเซิร์ฟเวอร์ต้องการการอัปเดตจาก rubygems, PyPI, PECL, CPAN หรือ npm พวกเขาจะต้องได้รับการเข้าถึงอินเทอร์เน็ตขาออกชั่วคราวเพื่อดึงแพ็คเกจ ฉันถูกขอให้เริ่มทำมิรเรอร์ rubygems และ PyPI และที่เหลือก็จะตามมา

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

  • สามารถเป็นได้ทั้งไปข้างหน้าหรือย้อนกลับ proxy; ตัวจัดการแพคเกจแต่ละตัวสนับสนุนพร็อกซีเซิร์ฟเวอร์หรือจุดเก็บข้อมูลปลายทางที่กำหนดเองซึ่งอาจเป็นมิรเรอร์โลคัลหรือพร็อกซีย้อนกลับ
  • จำเป็นต้องมีการควบคุมการเข้าถึงอย่างละเอียดดังนั้นฉันจึงสามารถ จำกัด IP ของไคลเอ็นต์ที่สามารถเชื่อมต่อกับโดเมน repo ได้
  • ลูกค้าจะต้องสามารถติดตามการเปลี่ยนเส้นทางไปยังโดเมนที่ไม่รู้จัก คำขอดั้งเดิมของคุณอาจ จำกัด อยู่ที่ rubygems.org แต่หากเซิร์ฟเวอร์นั้นส่งคืน 302 เป็น CDN แบบสุ่มคุณควรจะสามารถติดตามได้
  • ควรสนับสนุนแบ็กเอนด์ HTTPS ฉันไม่จำเป็นต้องปลอมตัวเป็นเซิร์ฟเวอร์ SSL อื่น แต่ฉันควรจะสามารถเปิดไซต์ HTTPS อีกครั้งผ่าน HTTP หรือยกเลิกและเข้ารหัสอีกครั้งด้วยใบรับรองที่แตกต่างกัน

ตอนแรกฉันดูพร็อกซีย้อนกลับและวานิชดูเหมือนจะเป็นคนเดียวที่จะอนุญาตให้ฉันแก้ไขภายใน 302 การเปลี่ยนเส้นทางภายในพร็อกซี อย่างไรก็ตาม Varnish รุ่นฟรีไม่รองรับแบ็กเอนด์ HTTPS ตอนนี้ฉันกำลังประเมิน Squid เป็นตัวเลือกไปข้างหน้าพร็อกซี่

ดูเหมือนว่าบางสิ่งที่ควรจะเป็นปัญหาที่พบบ่อยในเครือข่ายองค์กร แต่ฉันมีปัญหาในการค้นหาตัวอย่างว่าคนอื่น ๆ แก้ไขปัญหานี้ได้อย่างไร มีใครใช้สิ่งที่คล้ายกันหรือมีความคิดเกี่ยวกับวิธีที่ดีที่สุดที่จะทำเช่นนั้น?

ขอบคุณ!

คำตอบ:


5

เราใช้ Squid สำหรับสิ่งนี้ สิ่งที่ดีเกี่ยวกับปลาหมึกคือคุณสามารถตั้งค่าการหมดอายุของแต่ละวัตถุตามการจับคู่รูปแบบได้อย่างง่ายดายซึ่งช่วยให้เมตาดาต้าจาก yum repo ถูกกำจัดอย่างรวดเร็ว การกำหนดค่าที่เรามีซึ่งใช้:

refresh_pattern (Release|Packages(.gz)*)$      0       20%     2880
refresh_pattern (\.xml|xml\.gz)$      0       20%     2880
refresh_pattern ((sqlite.bz2)*)$      0       20%     2880
refresh_pattern (\.deb|\.udeb)$   1296000 100% 1296000
refresh_pattern (\.rpm|\.srpm)$   1296000 100% 1296000
refresh_pattern .        0    20%    4320

http://www.squid-cache.org/Doc/config/refresh_pattern/


5

นั่นคือกรณีการใช้งานที่ชัดเจนสำหรับพร็อกซี่ พร็อกซีปกติไม่ใช่พร็อกซีย้อนกลับ (aka. load balancer)

ส่วนใหญ่ที่รู้จักกันดีและฟรีและเปิดแหล่งที่มาเป็นปลาหมึก โชคดีที่มันเป็นหนึ่งในซอฟต์แวร์โอเพนซอร์สที่ดีไม่กี่คนที่สามารถจะติดตั้งมีเพียงหนึ่งเดียวและกำหนดค่าด้วยไฟล์เดียวapt-get install squid3/etc/squid3/squid.conf

เราจะอธิบายหลักปฏิบัติที่ดีและบทเรียนที่ควรรู้

ไฟล์การกำหนดค่าอย่างเป็นทางการแก้ไขเล็กน้อย (ลบความเห็นที่ไร้ประโยชน์ 5,000 บรรทัด)

#       WELCOME TO SQUID 3.4.8
#       ----------------------------
#
#       This is the documentation for the Squid configuration file.
#       This documentation can also be found online at:
#               http://www.squid-cache.org/Doc/config/
#
#       You may wish to look at the Squid home page and wiki for the
#       FAQ and other documentation:
#               http://www.squid-cache.org/
#               http://wiki.squid-cache.org/SquidFaq
#               http://wiki.squid-cache.org/ConfigExamples
#

###########################################################
# ACL
###########################################################

acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 1025-65535  # unregistered ports

acl CONNECT method CONNECT

#####################################################
# Recommended minimum Access Permission configuration
#####################################################
# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager

#####################################################
# ACL
#####################################################

# access is limited to our subnets
acl mycompany_net   src 10.0.0.0/8

# access is limited to whitelisted domains
# ".example.com" includes all subdomains of example.com
acl repo_domain dstdomain .keyserver.ubuntu.com
acl repo_domain dstdomain .debian.org
acl repo_domain dstdomain .python.org

# clients come from a known subnet AND go to a known domain
http_access allow repo_domain mycompany_net

# And finally deny all other access to this proxy
http_access deny all

#####################################################
# Other
#####################################################

# default proxy port is 3128
http_port 0.0.0.0:3128

# don't forward internal private IP addresses
forwarded_for off

# disable ALL caching
# bandwidth is cheap. debugging cache related bugs is expensive.
cache deny all

# logs
# Note: not sure if squid configures logrotate or not
access_log daemon:/var/log/squid3/access.log squid
access_log syslog:squid.INFO squid


# leave coredumps in the first cache dir
coredump_dir /var/spool/squid3

# force immediaty expiry of items in the cache.
# caching is disabled. This setting is set as an additional precaution.
refresh_pattern .               0       0%      0

การกำหนดค่าไคลเอนต์ - ตัวแปรสภาพแวดล้อม

กำหนดค่าตัวแปรสภาพแวดล้อมทั้งสองนี้ในทุกระบบ

http_proxy=squid.internal.mycompany.com:3128
https_proxy=squid.internal.mycompany.com:3128

ไลบรารีไคลเอ็นต์ HTTP ส่วนใหญ่ (libcurl, httpclient, ... ) กำลังกำหนดค่าด้วยตนเองโดยใช้ตัวแปรสภาพแวดล้อม แอปพลิเคชั่นส่วนใหญ่ใช้หนึ่งในไลบรารี่ทั่วไปและสนับสนุนการใช้พร็อกซี่นอกกล่อง

โปรดทราบว่าไวยากรณ์เข้มงวด:

  1. ชื่อตัวแปรhttp_proxyต้องเป็นตัวพิมพ์เล็กบน Linux ส่วนใหญ่
  2. ค่าตัวแปรต้องไม่เริ่มต้นด้วยhttp(s)://(โปรโตคอลพร็อกซีไม่ได้เป็น http)

การกำหนดค่าไคลเอนต์ - เฉพาะ

แอปพลิเคชั่นบางตัวไม่สนใจตัวแปรสภาพแวดล้อมและ / หรือทำงานเป็นบริการก่อนที่จะสามารถตั้งค่าตัวแปร (เช่นเดเบียนapt)

แอปพลิเคชันเหล่านี้จะต้องมีการกำหนดค่าพิเศษ (เช่น/etc/apt.conf)

HTTPS Proxying - เชื่อมต่อ

HTTPS proxying ได้รับการสนับสนุนอย่างเต็มที่จากการออกแบบ มันใช้วิธีพิเศษ "เชื่อมต่อ" ซึ่งจะสร้างช่องทางบางอย่างระหว่างเบราว์เซอร์และพร็อกซี

Dunno มากเกี่ยวกับสิ่งนั้น แต่ฉันไม่เคยมีปัญหากับมันในปี มันใช้งานได้

HTTPS กรณีพิเศษ - พร็อกซีโปร่งใส

หมายเหตุเกี่ยวกับพร็อกซีโปร่งใส (เช่นพร็อกซีถูกซ่อนและขัดขวางการร้องขอของลูกค้า ala. man-in-the-middle)

พร็อกซีที่โปร่งใสกำลังทำลาย HTTPS ลูกค้าไม่ทราบว่ามีพร็อกซีและไม่มีเหตุผลที่จะใช้วิธีการเชื่อมต่อแบบพิเศษ

ไคลเอ็นต์พยายามเชื่อมต่อ HTTPS โดยตรง ... ที่ถูกสกัดกั้น ตรวจพบการสกัดกั้นและเกิดข้อผิดพลาดทั่วทั้งสถานที่ (HTTPS มีไว้เพื่อตรวจจับการจู่โจมแบบ Man-in-He-Middle)

รายการที่อนุญาตของโดเมนและ CDN

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

เว็บไซต์ที่ทันสมัยสามารถมีการเปลี่ยนเส้นทางโดเมนและ CDN ได้ทุกประเภท สิ่งนี้จะทำลาย ACL เมื่อผู้คนไม่ไปไกลเกินกว่าจะเก็บทุกอย่างไว้ในโดเมนเดียว

บางครั้งจะมีตัวติดตั้งหรือแพ็คเกจที่ต้องการโทรหา homeship หรือเรียกใช้การอ้างอิงภายนอกก่อนที่จะทำงาน มันจะล้มเหลวทุกครั้งและไม่มีอะไรที่คุณสามารถทำได้

เก็บเอาไว้

ไฟล์การกำหนดค่าที่ให้ไว้จะปิดใช้งานการแคชทุกรูปแบบ ปลอดภัยกว่าดีกว่าขออภัย

โดยส่วนตัวฉันใช้งานในระบบคลาวด์ในขณะนี้อินสแตนซ์ทั้งหมดมีการเชื่อมต่ออย่างน้อย 100 Mbps และผู้ให้บริการใช้ repos ของตัวเองสำหรับสิ่งที่เป็นที่นิยม (เช่น Debian) ซึ่งถูกค้นพบโดยอัตโนมัติ นั่นทำให้แบนด์วิดท์เป็นสินค้าที่ฉันไม่สามารถใส่ใจได้

ฉันต้องการปิดใช้งานการแคชโดยสิ้นเชิงมากกว่าประสบการณ์ข้อบกพร่องแคชเดียวที่จะละลายสมองของฉันในการแก้ไขปัญหา ทุกคนบนอินเทอร์เน็ตไม่สามารถรับส่วนหัวแคชได้

ไม่ใช่ว่าทุกสภาพแวดล้อมจะมีข้อกำหนดเหมือนกัน คุณสามารถไปได้ไกลกว่านั้นและกำหนดค่าการแคชได้

ไม่เคยต้องการการรับรองความถูกต้องบนพร็อกซี

มีตัวเลือกที่ต้องใช้การตรวจสอบรหัสผ่านจากลูกค้าซึ่งโดยปกติจะใช้บัญชี LDAP ของพวกเขา มันจะทำลายทุกเบราว์เซอร์และเครื่องมือบรรทัดคำสั่งทุกอันในจักรวาล

หากคุณต้องการทำการรับรองความถูกต้องบนพร็อกซีอย่า

หากฝ่ายบริหารต้องการการพิสูจน์ตัวตนให้อธิบายว่ามันเป็นไปไม่ได้

หากคุณเป็นนักพัฒนาซอฟต์แวร์และคุณเพิ่งเข้าร่วม บริษัท ที่บล็อกอินเทอร์เน็ตโดยตรงและบังคับใช้การรับรองความถูกต้องของพร็อกซี RUN Away ในขณะที่คุณทำได้

ข้อสรุป

เราผ่านการตั้งค่าทั่วไปข้อผิดพลาดทั่วไปและสิ่งที่เราต้องรู้เกี่ยวกับการมอบฉันทะ

บทเรียนได้เรียนรู้:

  • มีซอฟต์แวร์โอเพนซอร์ซที่ดีสำหรับพร็อกซี่ (ปลาหมึก)
  • ง่ายและสะดวกในการกำหนดค่า (ไฟล์สั้น ๆ ไฟล์เดียว)
  • มาตรการรักษาความปลอดภัย (ไม่บังคับ) ทั้งหมดมีการแลกเปลี่ยน
  • ตัวเลือกขั้นสูงส่วนใหญ่จะทำลายสิ่งของและกลับมาหลอกหลอนคุณ
  • พร็อกซีที่โปร่งใสกำลังทำลาย HTTPS
  • การรับรองความถูกต้องของพร็อกซีนั้นชั่วร้าย

ตามปกติในการออกแบบโปรแกรมและระบบสิ่งสำคัญคือการจัดการข้อกำหนดและความคาดหวัง

ฉันขอแนะนำให้ยึดติดกับพื้นฐานเมื่อตั้งค่าพร็อกซี โดยทั่วไปพร็อกซีธรรมดาที่ไม่มีตัวกรองจะทำงานได้ดีและไม่มีปัญหาใด ๆ เพียงจำไว้ว่าให้ (อัตโนมัติ) กำหนดค่าไคลเอนต์


s / man-in-he-middle / man-in-the-middle / (S / E ไม่อนุญาตให้แก้ไขตัวอักษรเดียว)
Chen Levy

4

สิ่งนี้จะไม่แก้งานทั้งหมดของคุณ แต่อาจเป็นประโยชน์ แม้จะมีชื่อapt-cacher-ngไม่เพียงทำงานกับ Debian และอนุพันธ์เท่านั้น

พร็อกซีแคช เฉพาะสำหรับไฟล์แพคเกจจากผู้จำหน่าย Linux ส่วนใหญ่ใช้สำหรับการแจกแจงแบบ Debian (และแบบ Debian) แต่ไม่ จำกัด เพียงการแจกจ่าย

ฉันใช้สิ่งนี้ในการผลิตในสภาพแวดล้อมที่คล้ายกัน (อิงเดเบียน) เช่นคุณ

อย่างไรก็ตาม AFAIK สิ่งนี้จะไม่สนับสนุน rubygems, PyPI, PECL, CPAN หรือ npm และไม่ได้ให้ ACL แบบละเอียด

โดยส่วนตัวฉันคิดว่าการสืบสวน Squid เป็นความคิดที่ดี หากคุณใช้การตั้งค่าในท้ายที่สุดคุณช่วยแบ่งปันประสบการณ์ของคุณได้ไหม? ฉันค่อนข้างสนใจว่ามันจะไปอย่างไร


2

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

ลูกค้าได้รับข้อมูลที่เก็บจากการจัดการการกำหนดค่าของเราดังนั้นการสลับเป็นเรื่องง่ายหากจำเป็น

คุณสามารถบรรลุสิ่งที่คุณต้องการโดยใช้ ace บนพร็อกซีเซิร์ฟเวอร์โดยใช้สตริงตัวแทนผู้ใช้หรือการรวมกันของ ips / มาสก์และ จำกัด การเข้าถึงโดเมนบางอย่าง แต่ถ้าคุณทำเช่นนั้นปัญหาหนึ่งที่ฉันเห็นคือแพ็คเกจ / ไลบรารีรุ่นต่าง ๆ ดังนั้นหากหนึ่งในโฮสต์สามารถเข้าถึง cpan และร้องขอโมดูล xxx :: yyy ได้เว้นแต่ว่าลูกค้าแนะนำให้ใช้เวอร์ชันเฉพาะจะดึงเวอร์ชันล่าสุดออกมาจาก cpan (หรือ pypy หรือ rubygems) ซึ่งอาจจะใช่หรือไม่ใช่อันที่เคยเป็นอยู่แล้ว แคชในพรอกซี ดังนั้นคุณอาจจบลงด้วยรุ่นที่แตกต่างกันในสภาพแวดล้อมเดียวกัน คุณจะไม่มีปัญหานั้นหากคุณใช้ที่เก็บข้อมูลในเครื่อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.