puppet master REST API ส่งคืน 403 เมื่อทำงานภายใต้การทำงานของผู้โดยสารเมื่อต้นแบบรันจากบรรทัดคำสั่ง


3

ฉันใช้ auth.conf มาตรฐานที่ให้ไว้ในการติดตั้งหุ่นเชิดสำหรับเจ้านายหุ่นเชิดซึ่งกำลังวิ่งผ่านผู้โดยสารภายใต้ Nginx อย่างไรก็ตามสำหรับแคตตาล็อกส่วนใหญ่ไฟล์และคำขอการรับรองฉันได้รับการตอบกลับ 403

### Authenticated paths - these apply only when the client
### has a valid certificate and is thus authenticated

# allow nodes to retrieve their own catalog
path ~ ^/catalog/([^/]+)$
method find
allow $1

# allow nodes to retrieve their own node definition
path ~ ^/node/([^/]+)$
method find
allow $1

# allow all nodes to access the certificates services
path ~ ^/certificate_revocation_list/ca
method find 
allow *

# allow all nodes to store their reports
path /report
method save
allow *

# unconditionally allow access to all file services
# which means in practice that fileserver.conf will
# still be used
path /file
allow *

### Unauthenticated ACL, for clients for which the current master doesn't
### have a valid certificate; we allow authenticated users, too, because
### there isn't a great harm in letting that request through.

# allow access to the master CA
path /certificate/ca
auth any
method find
allow *

path /certificate/
auth any
method find
allow *

path /certificate_request
auth any
method find, save
allow *

path /facts
auth any
method find, search
allow *

# this one is not stricly necessary, but it has the merit
# of showing the default policy, which is deny everything else
path /
auth any

หุ่นกระบอกต้นแบบ แต่ดูเหมือนว่าจะไม่ได้ติดตามสิ่งนี้เนื่องจากฉันได้รับข้อผิดพลาดนี้บนไคลเอนต์

[amisr1@blramisr195602 ~]$ sudo puppet agent --no-daemonize --verbose --server bangvmpllda02.XXXXX.com
[sudo] password for amisr1: 
Starting Puppet client version 3.0.1
Warning: Unable to fetch my node definition, but the agent run will continue:
Warning: Error 403 on SERVER: Forbidden request: XX.XXX.XX.XX(XX.XXX.XX.XX) access to /certificate_revocation_list/ca [find] at :110
Info: Retrieving plugin
Error: /File[/var/lib/puppet/lib]: Failed to generate additional resources using 'eval_generate: Error 403 on SERVER: Forbidden request: XX.XXX.XX.XX(XX.XXX.XX.XX) access to /file_metadata/plugins [search] at :110
Error: /File[/var/lib/puppet/lib]: Could not evaluate: Error 403 on SERVER: Forbidden request: XX.XXX.XX.XX(XX.XXX.XX.XX) access to /file_metadata/plugins [find] at :110 Could not retrieve file metadata for puppet://devops.XXXXX.com/plugins: Error 403 on SERVER: Forbidden request: XX.XXX.XX.XX(XX.XXX.XX.XX) access to /file_metadata/plugins [find] at :110
Error: Could not retrieve catalog from remote server: Error 403 on SERVER: Forbidden request: XX.XXX.XX.XX(XX.XXX.XX.XX) access to /catalog/blramisr195602.XXXXX.com [find] at :110
Using cached catalog
Error: Could not retrieve catalog; skipping run
Error: Could not send report: Error 403 on SERVER: Forbidden request: XX.XXX.XX.XX(XX.XXX.XX.XX) access to /report/blramisr195602.XXXXX.com [save] at :110

และบันทึกเซิร์ฟเวอร์แสดง

XX.XXX.XX.XX - - [10/Dec/2012:14:46:52 +0530] "GET /production/certificate_revocation_list/ca? HTTP/1.1" 403 102 "-" "Ruby"
XX.XXX.XX.XX - - [10/Dec/2012:14:46:52 +0530] "GET /production/file_metadatas/plugins?links=manage&recurse=true&&ignore=---+%0A++-+%22.svn%22%0A++-+CVS%0A++-+%22.git%22&checksum_type=md5 HTTP/1.1" 403 95 "-" "Ruby"
XX.XXX.XX.XX - - [10/Dec/2012:14:46:52 +0530] "GET /production/file_metadata/plugins? HTTP/1.1" 403 93 "-" "Ruby"
XX.XXX.XX.XX - - [10/Dec/2012:14:46:53 +0530] "POST /production/catalog/blramisr195602.XXXXX.com HTTP/1.1" 403 106 "-" "Ruby"
XX.XXX.XX.XX - - [10/Dec/2012:14:46:53 +0530] "PUT /production/report/blramisr195602.XXXXX.com HTTP/1.1" 403 105 "-" "Ruby"

ไฟล์ conf ของเซิร์ฟเวอร์ thefile มีดังนี้ (และ goin โดยสิ่งที่พวกเขาพูดบนเว็บไซต์ puppet จะเป็นการดีกว่าที่จะควบคุมการเข้าถึงใน auth.conf สำหรับการเข้าถึงเซิร์ฟเวอร์ไฟล์แล้วอนุญาตให้เซิร์ฟเวอร์ไฟล์ไปยังเซิร์ฟเวอร์ทั้งหมด)

[files]
  path /apps/puppet/files
  allow *
[private]
  path /apps/puppet/private/%H
  allow *
[modules]
  allow *

ฉันใช้เซิร์ฟเวอร์และไคลเอนต์เวอร์ชัน 3

Nginx ถูกคอมไพล์โดยใช้ตัวเลือกต่อไปนี้

nginx version: nginx/1.3.9
built by gcc 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC) 
TLS SNI support enabled
configure arguments: --prefix=/apps/nginx --conf-path=/apps/nginx/nginx.conf --pid-path=/apps/nginx/run/nginx.pid --error-log-path=/apps/nginx/logs/error.log --http-log-path=/apps/nginx/logs/access.log --with-http_ssl_module --with-http_gzip_static_module --add-module=/usr/lib/ruby/gems/1.8/gems/passenger-3.0.18/ext/nginx --add-module=/apps/Downloads/nginx/nginx-auth-ldap-master/

และต้นแบบหุ่นกระบอก nginx มาตรฐาน conf

server {
ssl                on;
listen                     8140 ssl;
server_name        _;

passenger_enabled          on;
passenger_set_cgi_param    HTTP_X_CLIENT_DN $ssl_client_s_dn; 
passenger_set_cgi_param    HTTP_X_CLIENT_VERIFY $ssl_client_verify; 
passenger_min_instances    5;

access_log                 logs/puppet_access.log;
error_log                  logs/puppet_error.log;

root                       /apps/nginx/html/rack/public;

ssl_certificate            /var/lib/puppet/ssl/certs/bangvmpllda02.XXXXXX.com.pem;
ssl_certificate_key        /var/lib/puppet/ssl/private_keys/bangvmpllda02.XXXXXX.com.pem;
ssl_crl                    /var/lib/puppet/ssl/ca/ca_crl.pem;
ssl_client_certificate     /var/lib/puppet/ssl/certs/ca.pem;
ssl_ciphers                SSLv2:-LOW:-EXPORT:RC4+RSA;
ssl_prefer_server_ciphers  on;
ssl_verify_client          optional;
ssl_verify_depth           1;
ssl_session_cache          shared:SSL:128m;
ssl_session_timeout        5m;
}

Puppet กำลังรับการตั้งค่าที่ถูกต้องจากไฟล์ที่กล่าวถึงเนื่องจากคำสั่ง config พิมพ์ชี้ไปที่ / etc / puppet

[amisr1@bangvmpllDA02 puppet]$ sudo puppet config print | grep conf
async_storeconfigs = false
authconfig = /etc/puppet/namespaceauth.conf
autosign = /etc/puppet/autosign.conf
catalog_cache_terminus = store_configs
confdir = /etc/puppet
config = /etc/puppet/puppet.conf
config_file_name = puppet.conf
config_version = ""
configprint = all
configtimeout = 120
dblocation = /var/lib/puppet/state/clientconfigs.sqlite3
deviceconfig = /etc/puppet/device.conf
fileserverconfig = /etc/puppet/fileserver.conf
genconfig = false
hiera_config = /etc/puppet/hiera.yaml
localconfig = /var/lib/puppet/state/localconfig
name = config
rest_authconfig = /etc/puppet/auth.conf
storeconfigs = true
storeconfigs_backend = puppetdb
tagmap = /etc/puppet/tagmail.conf
thin_storeconfigs = false

ฉันตรวจสอบกฎไฟร์วอลล์ของ VM นี้ อนุญาต 80, 443, 8140, 3000 ฉันยังต้องปรับแต่งข้อมูลเฉพาะใด ๆ ใน auth.conf เพื่อให้มันใช้งานได้หรือไม่?

ปรับปรุง

ฉันเพิ่มการบันทึกอย่างละเอียดลงในต้นแบบหุ่นเชิดแล้วรีสตาร์ท nginx; นี่คือข้อมูลเพิ่มเติมที่ฉันเห็นในบันทึก

Mon Dec 10 18:19:15 +0530 2012 Puppet (err): Could not resolve 10.209.47.31: no name for 10.209.47.31
Mon Dec 10 18:19:15 +0530 2012 access[/] (info): defaulting to no access for 10.209.47.31
Mon Dec 10 18:19:15 +0530 2012 Puppet (warning): Denying access: Forbidden request: 10.209.47.31(10.209.47.31) access to /file_metadata/plugins [find] at :111
Mon Dec 10 18:19:15 +0530 2012 Puppet (err): Forbidden request: 10.209.47.31(10.209.47.31) access to /file_metadata/plugins [find] at :111
10.209.47.31 - - [10/Dec/2012:18:19:15 +0530] "GET /production/file_metadata/plugins? HTTP/1.1" 403 93 "-" "Ruby"

บนเอเจนต์เครื่อง facter fqdn และ hostname ทั้งคู่จะส่งคืนชื่อโฮสต์แบบเต็ม

[amisr1@blramisr195602 ~]$ sudo facter fqdn
blramisr195602.XXXXXXX.com

ฉันแล้วอัปเดตการกำหนดค่าตัวแทนเพื่อเพิ่ม

dns_alt_names = 10.209.47.31

ทำความสะอาดใบรับรองทั้งหมดในต้นแบบและตัวแทนและสร้างใบรับรองใหม่และลงนามในใบรับรองโดยใช้ตัวเลือก --allow-dns-alt-names

[amisr1@bangvmpllDA02 ~]$ sudo puppet cert sign blramisr195602.XXXXXX.com

Error: CSR 'blramisr195602.XXXXXX.com' contains subject alternative names (DNS:10.209.47.31, DNS:blramisr195602.XXXXXX.com), which are 
disallowed. Use `puppet cert --allow-dns-alt-names sign blramisr195602.XXXXXX.com` to sign this request.

[amisr1@bangvmpllDA02 ~]$ sudo puppet cert --allow-dns-alt-names sign blramisr195602.XXXXXX.com

Signed certificate request for blramisr195602.XXXXXX.com
Removing file Puppet::SSL::CertificateRequest blramisr195602.XXXXXX.com at '/var/lib/puppet/ssl/ca/requests/blramisr195602.XXXXXX.com.pem'

อย่างไรก็ตามนั่นไม่ได้ช่วยอะไรเช่นกัน ฉันได้รับข้อผิดพลาดเหมือนเดิม ไม่แน่ใจว่าทำไมในบันทึกจึงแสดงการเปรียบเทียบกฎการเข้าถึงโดย IP ไม่ใช่ชื่อโฮสต์ มีการกำหนดค่า Nginx เพื่อเปลี่ยนพฤติกรรมนี้หรือไม่?


** อัพเดท **: ทุกอย่างทำงานได้ดีถ้าฉันเรียกใช้ puppet master ผ่าน command line; จากนั้นรีสตาร์ทเอเจนต์ แต่ให้ข้อผิดพลาดอีกครั้งเมื่อฉันเรียกใช้ master เป็นแอพผู้โดยสารใน nginx
Anadi Misra

คำตอบ:


4

ฉันเปรียบเทียบกับการตั้งค่าอื่นที่เรามีใน nginx; ดูเหมือนว่าปัญหาเกิดจากคุณสมบัติ

ssl_client_header = SSL_CLIENT_S_D
ssl_client_verify_header = SSL_CLIENT_VERIFY

ปรากฏตัวใน puppet.conf ของอาจารย์ การคอมเม้นต์พวกเขาออกจากที่นั่นและปล่อยให้การตั้งค่าสำหรับพวกเขาใน Nginx แก้ไขปัญหาได้


3

อาการนี้จะหายไปถ้าคุณเคยใช้ Puppet ภายใต้ Nginx / Passenger และคุณอัปเกรดเป็นผู้โดยสาร 5.0+ ผมพบว่าวิธีการแก้ปัญหาที่นี่

ผู้โดยสาร 5.0 ได้แทนที่ "ผู้โดยสาร_set_cgi_param" ด้วย "ผู้โดยสาร_set_header" ซึ่งหากคุณทำสิ่งนี้ได้ไกลคุณจะได้รู้ว่า สิ่งที่คุณอาจพลาดได้คือ "passenger_set_header" จะเติม HTTP_ ให้กับค่าโดยอัตโนมัติดังนั้นคุณจะต้องลบออกจากบรรทัด HTTP_X_CLIENT_S_DN และ HTTP_X_CLIENT_VERIFY ของคุณ


phusionpassenger.com/library/config/nginx/reference/ ...... คุณควรผ่าน X-Client-DN X-Client-Verify เช่นนี้เพื่อให้มันใช้งานได้
Sander Visser

0

ชั้นวางของคุณconfig.ruเป็นเจ้าของโดยหุ่นกระบอกผู้ใช้ / กลุ่ม: หุ่นเชิดหรือไม่? จากเอกสารประกอบ Puppet Labs:

Whatever you do, make sure your config.ru file is owned by the puppet user! Passenger will setuid to that user. http://projects.puppetlabs.com/projects/1/wiki/using_passenger

ตรวจสอบให้แน่ใจว่า / etc / puppet และ / var / lib / puppet เป็นเจ้าของโดย puppet: puppet ด้วยเช่นกัน


ใช่ว่ามันเป็นอย่างไร พวกเขาทั้งหมดเป็นเจ้าของโดยผู้ใช้หุ่นกระบอกกลุ่มหุ่น nginx ยังทำงานภายใต้ผู้ใช้เดียวกัน ปัญหาเกิดขึ้นเมื่อฉันเรียกใช้ master ภายใต้ nginx ถ้าเรียกใช้เป็นบริการของระบบมันทำงานได้ดีทั้งหมดไม่มี 403s สำหรับ URL เหล่านี้
Anadi Misra

0

ก่อนอื่นฉันจะตรวจสอบว่าสถานะของ puppetmaster คืออะไรอาจเป็น selinux configuration หรือพอร์ต 8140 กำลังฟัง "httpd" ลองตรวจสอบผลลัพธ์ของnetstat -anpl | grep 8140

บน puppetmaster พยายามเรียกใช้ sudo puppet master --verbose --no-daemonize

หากต้นแบบหุ่นเชิดเริ่มต้นโดยไม่มีข้อผิดพลาดใด ๆ คุณอาจต้องมุ่งเน้นไปที่ตัวแทนหุ่นเชิด

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