Score:1

การตรวจสอบสิทธิ์ ftp กับฐานข้อมูล (postgres) หลายฐานข้อมูล

ธง iq

สถานะปัจจุบัน

กำหนดเป็นโฮสต์ที่มีที่อยู่ IPv4 สองแห่งและการเข้าถึง HTTP & FTP สำหรับแต่ละที่อยู่ แต่ละ vhost สามารถเข้าถึงฐานข้อมูล PostgreSQL ได้ การรับรองความถูกต้องของเว็บและ ftp ทำกับฐานข้อมูลที่เกี่ยวข้อง สำหรับ proftpd ฉันใช้การตั้งค่านี้สำหรับแต่ละที่อยู่ IP/vhost ($VALUES ไม่มีตัวแปร แต่ซ่อนค่าจริง):

SQLConnectInfo $VHOST@localhost $SQLUSER $SQLPASS
เข้าสู่ระบบ SQLUserInfo รหัสผ่านเข้าสู่ระบบ 33 33 "CONCAT('/var/www/$VHOST/upload/', id)" "'/bin/bash'"

โดยพื้นฐานแล้วผู้ใช้เว็บทุกคนมีบัญชี ftp ที่โฮสต์เดียวกันพร้อมข้อมูลรับรองเดียวกัน ภายในพวกเขาทำงานเป็น www-data.www-data และแต่ละบัญชีในแต่ละ vhost จะมีโฟลเดอร์แยกต่างหาก ทำงานได้ดี

งาน & ไอเดีย

ไม่ต้องการที่อยู่ IPv4 เพิ่มเติมสำหรับ vhosts เพิ่มเติม (และควรกำจัดที่อยู่ส่วนใหญ่ที่มีอยู่) รับตามที่ลูกค้าต้องการการเข้าถึง ftp และ IPv4 อย่างน้อยอีกสองสามปีข้างหน้า มิฉะนั้น สิ่งต่างๆ จะเป็นเรื่องง่าย

Ftp ไม่มีแนวคิดของ vhosts ดังนั้นวิธีที่ดีที่สุดที่ฉันคิดได้คือการใช้ชื่อบัญชีเช่น $VHOST.$LOGIN (ควรเป็นที่ยอมรับสำหรับลูกค้า) ฉันสามารถแยกชื่อล็อกอินที่จุด ใช้ส่วนแรกเป็นชื่อฐานข้อมูล และส่วนที่สองเป็นชื่อล็อกอิน ไม่มีอะไรจะต้องเปลี่ยนแปลงอีก

ปัญหา

ฉันไม่พบซอฟต์แวร์ใด ๆ ที่รองรับ ฉันไม่เห็นวิธีรวมการตั้งค่าดังกล่าวเข้ากับการกำหนดค่า proftpd และไม่พบ ftp daemon ตัวอื่นที่ยืดหยุ่นกว่า

การพูดนอกเรื่อง: ที่นั่น เป็น สิ่งต่าง ๆ เช่น SQLNamedConnectInfo / SQLNamedQuery และฉันสามารถรับรูปแบบชื่อล็อกอินที่ต้องการรวมถึงการใช้ฐานข้อมูลเฉพาะด้วย:

SQLNamedConnectInfo $VHOST postgres $VHOST@localhost $SQLUSER $SQLPASS
SQLNamedQuery $VHOST SELECT "เข้าสู่ระบบ, รหัสผ่าน, 33, 33, CONCAT('/var/www/$VHOST.epaxios.com/upload/', id), '/bin/bash' จากการเข้าสู่ระบบ WHERE Login=substr('% U', strpos('%U', '.')+1) AND substr('%U', 1, strpos('%U', '.')-1)='$VHOST'" $VHOST
SQLUserInfo กำหนดเอง:/$VHOST

แต่น่าเสียดายที่สิ่งนี้สามารถรวมได้เพียงครั้งเดียว (ในส่วนหลัก มีที่อยู่ IP เพียง 1 รายการ) - ด้วยวิธีการดังกล่าว ฉันจำเป็นต้องทำซ้ำผ่าน vhosts/databases ทั้งหมด อย่างไรก็ตาม...

สิ่งต่อไปที่ฉันดูคือ PAM - มี pam_pgsql แต่ไม่มีสิ่งใดรองรับฐานข้อมูลที่แตกต่างกัน (ไม่ว่าจะขึ้นอยู่กับบางส่วนของชื่อผู้ใช้หรือไม่)

สิ่งสุดท้ายที่ฉันคิดได้คือ libnssมี libnss-pgsql แต่อีกครั้งรองรับการเชื่อมต่อเดียวไปยังตารางเฉพาะ - แน่นอนว่าเป็นกรณีการใช้งานทั่วไปที่สุด แต่ไม่เพียงพอสำหรับฉัน

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

Castaglia avatar
id flag
ไคลเอนต์ FTP รุ่นใหม่รองรับคำสั่ง `HOST` (ดู [RFC 7151](https://datatracker.ietf.org/doc/html/rfc7151)) ซึ่งใช้ vhosting ตามชื่อสำหรับ FTP นอกจากการรองรับ `HOST` แล้ว สำหรับ FTPS แล้ว ProFTPD ยังรองรับ [TLS SNI](https://en.wikipedia.org/wiki/Server_Name_Indication) สำหรับ vhosts FTPS ที่อิงตามชื่ออีกด้วย
iq flag
@Castaglia น่าเศร้าที่สิ่งนี้ดีพอ ๆ กับการเปลี่ยนไปใช้ IPv6: สมบูรณ์แบบ แต่ใช้งานไม่ได้ ฉันเปลี่ยนสภาพแวดล้อมการทดสอบและติดต่อลูกค้าที่ทราบทางเทคนิคมากที่สุดประมาณ 10 ราย: ปฏิกิริยาสองครั้งเช่น "เอ่อ?" ไม่เช่นนั้นเงียบและยังไม่มีการเชื่อมต่อที่สำเร็จแม้แต่ครั้งเดียว หากฉันไม่พบวิธีแก้ปัญหาที่ลูกค้าไม่ต้องการการเปลี่ยนแปลงใดๆ (ทางเทคนิค) แสดงว่าฉันไม่พบวิธีแก้ปัญหาเลย :(
Castaglia avatar
id flag
ฉันเข้าใจ. ความเป็นไปได้อีกอย่างคือการใช้พร็อกซีเช่น [`pgpool`](https://www.pgpool.net/) ซึ่งพร็อกซีแมปชื่อผู้ใช้ไคลเอ็นต์กับฐานข้อมูลแบ็กเอนด์ที่จะใช้

โพสต์คำตอบ

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