Python CGI บนอินสแตนซ์ขนาดเล็กของ Amazon AWS EC2 - วิธีใช้!


23

คุณจะสร้างอินสแตนซ์ขนาดเล็ก EC2 ให้บริการสคริปต์ CGI จาก lighthttpd ได้อย่างไร เช่น Python CGI?

มันใช้เวลาครึ่งวัน แต่ฉันได้รับ Python cgi ที่ทำงานบนไมโครอินสแตนซ์ Amazon AWS EC2 ฟรีโดยใช้เซิร์ฟเวอร์ lighttpd ฉันคิดว่ามันจะช่วย noobs เพื่อนของฉันที่จะวางขั้นตอนทั้งหมดในที่เดียว ด้วยขั้นตอนง่าย ๆ ด้านล่างจะใช้เวลาเพียง 15 นาทีในการตั้งค่า!

คำถามของฉันสำหรับผู้ใช้ที่มีประสบการณ์อ่านนี้คือ: มีข้อบกพร่องด้านความปลอดภัยในสิ่งที่ฉันได้ทำ? (ดูการอนุญาตไฟล์และไดเรกทอรี)

ขั้นตอนที่ 1: เริ่มต้นอินสแตนซ์ EC2 ของคุณและ ssh ลงไป

[เห็นได้ชัดว่าคุณจะต้องลงชื่อสมัครใช้ Amazon EC2 และบันทึกคู่กุญแจของคุณลงในไฟล์ * .pem ฉันจะไม่ข้ามเรื่องนี้ไปอย่างที่อเมซอนบอกให้คุณทำอย่างไร]

  1. ลงชื่อเข้าใช้บัญชี AWS ของคุณและเริ่มอินสแตนซ์ EC2 ของคุณ เว็บมีแบบฝึกหัดในการทำเช่นนี้ ขอให้สังเกตว่าขนาดอินสแตนซ์เริ่มต้นที่ Amazon มอบให้คุณคือ "เล็ก" นี่ไม่ใช่ "ไมโคร" และดังนั้นคุณจะเสียค่าใช้จ่าย อย่าลืมเลือก "ไมโคร" ด้วยตนเอง (อินสแตนซ์ขนาดเล็กให้บริการฟรีเฉพาะในปีแรก ... )

  2. ค้นหารหัส DNS สาธารณะสำหรับอินสแตนซ์ที่คุณใช้งานอยู่ หากต้องการทำสิ่งนี้ให้คลิกที่อินสแตนซ์ในบานหน้าต่างด้านบนของแดชบอร์ดและในที่สุดคุณจะเห็นฟิลด์ "สาธารณะ DNS" ซึ่งมีอยู่ในบานหน้าต่างด้านล่าง (คุณอาจต้องทำเล่น ๆ สักหน่อย) DNS สาธารณะจะมีลักษณะดังนี้:
    ec2-174-129-110-23.compute-1.amazonaws.com

  3. เริ่มโปรแกรมคอนโซล Unix ของคุณ (บน Max OS X จะเรียกว่า Terminal และอยู่ในโฟลเดอร์ Applications -> Utilities)

  4. cd ไปยังไดเรกทอรีบนระบบเดสก์ท็อปของคุณที่มีไฟล์ * .pem ของคุณมีคู่คีย์ AWS ของคุณ

  5. ssh ไปยังอินสแตนซ์ EC2 ของคุณโดยใช้คำสั่งเช่น:
    ssh -i <<your *.pem filename>> ec2-user@<< Public DNS address >>

    ดังนั้นสำหรับฉันนี่คือ:
    ssh -i amzn_ec2_keypair.pem ec2-user@ec2-174-129-110-23.compute-1.amazonaws.com

  6. อินสแตนซ์ EC2 ของคุณควรปล่อยให้คุณเข้า

ขั้นตอนที่ 2: ดาวน์โหลด lighttpd ไปยังอินสแตนซ์ EC2 ของคุณ

  1. ในการติดตั้ง lighttpd คุณจะต้องเข้าถึงรูทบนอินสแตนซ์ EC2 ของคุณ ปัญหาคือ: อเมซอนจะไม่ยอมให้คุณลงชื่อเข้าใช้ในฐานะรูท (ไม่ตรงไปตรงมาอย่างน้อย) แต่ก็มีวิธีแก้ปัญหา พิมพ์คำสั่งนี้:
    sudo /bin/bash

  2. ตัวอักษรระบบจะเปลี่ยนจาก $ เป็น # เราจะไม่ออกจาก "sudo" จนกว่าจะถึงขั้นตอนสุดท้ายในกระบวนการทั้งหมดนี้

  3. ติดตั้งแอปพลิเคชั่น lighttpd (เวอร์ชั่น 1.4.28-1.3.amzn1 ให้ฉัน):
    yum install lighttpd

  4. ติดตั้งไลบรารี FastCGI สำหรับ lighttpd (ไม่จำเป็น แต่ทำไมไม่ทำ):
    yum install lighttpd-fastcgi

  5. ทดสอบว่าเซิร์ฟเวอร์ของคุณใช้งานได้:
    /etc/init.d/lighttpd start

ขั้นตอนที่ 3: ให้โลกภายนอกมองเห็นเซิร์ฟเวอร์ของคุณ

  1. หากคุณพยายามโจมตีเซิร์ฟเวอร์ของคุณจากเบราว์เซอร์บนเดสก์ท็อปของคุณมันจะล้มเหลว เหตุผล: ตามค่าเริ่มต้น Amazon AWS จะไม่เปิดพอร์ตใด ๆ กับอินสแตนซ์ EC2 ของคุณ ดังนั้นคุณต้องเปิดพอร์ตด้วยตนเอง

  2. ไปที่แดชบอร์ด EC2 ในเบราว์เซอร์เดสก์ท็อปของคุณ คลิกที่ "กลุ่มความปลอดภัย" ในบานหน้าต่างด้านซ้าย กลุ่มความปลอดภัยอย่างน้อยหนึ่งกลุ่มจะปรากฏในบานหน้าต่างด้านขวาบน เลือกอันที่ถูกกำหนดให้กับอินสแตนซ์ EC2 ของคุณเมื่อคุณเปิดใช้งานอินสแตนซ์ของคุณ

  3. ตารางที่ชื่อว่า "การเชื่อมต่อที่อนุญาต" จะปรากฏในบานหน้าต่างด้านขวาล่าง เมนูป๊อปอัปจะให้คุณเลือก "HTTP" เป็นวิธีการเชื่อมต่อ

  4. ค่าอื่น ๆ ในบรรทัดของตารางนั้นควรเป็น: tcp, 80, 80, 0.0.0.0/0

  5. ตอนนี้กดเซิร์ฟเวอร์ของอินสแตนซ์ EC2 ของคุณจากเดสก์ท็อปในเบราว์เซอร์ของคุณ ใช้ที่อยู่ DNS สาธารณะที่คุณใช้ก่อนหน้านี้กับ SSH คุณควรเห็นเว็บเพจทั่วไป lighttpd ถ้าคุณทำไม่ได้ฉันก็ช่วยคุณไม่ได้เพราะฉันเป็นคนไม่มีอะไร :-(

ขั้นตอนที่ 4: กำหนดค่า lighttpd เพื่อให้บริการ CGI

  1. ย้อนกลับไปในโปรแกรมคอนโซล cd ไปยังไดเรกทอรีการกำหนดค่าสำหรับ lighttpd:
    cd /etc/lighttpd

  2. ในการเปิดใช้งาน CGI คุณต้องการยกเลิกการคอมเม้นต์หนึ่งบรรทัดในไฟล์ <modules.conf> (ฉันสามารถเปิดใช้งาน Fast CGI ได้ แต่ขั้นตอนเด็กดีที่สุด!) คุณสามารถทำได้ด้วยเครื่องมือ "ed" ดังต่อไปนี้:
    ed modules.conf
    /include "conf.d\/cgi.conf"/
    s/#//
    w
    q

  3. สร้างไดเรกทอรีที่โปรแกรม CGI จะทำงาน (ไฟล์ /etc/lighttpd/lighttpd.conf เป็นตัวกำหนดว่าจะอยู่ที่ใด) เราจะสร้างไดเรกทอรีของเราในตำแหน่งเริ่มต้นดังนั้นเราไม่ต้องแก้ไขไฟล์กำหนดค่าใด ๆ :
    cd /var/www/lighttpd
    mkdir cgi-bin
    chmod 755 cgi-bin

  4. เกือบจะมี! แน่นอนคุณต้องใส่โปรแกรมทดสอบ CGI ลงในไดเรกทอรี cgi-bin นี่คือหนึ่ง:
    cd cgi-bin
    ed
    a
    #!/usr/bin/python
    print "Content-type: text/html\n\n"
    print "<html><body>Hello, pyworld.</body></html>"
    .
    w hellopyworld.py
    q
    chmod 655 hellopyworld.py

  5. รีสตาร์ทเซิร์ฟเวอร์ lighttpd ของคุณ:
    /etc/init.d/lighttpd restart

  6. ทดสอบโปรแกรม CGI ของคุณ ในเบราว์เซอร์ของเดสก์ท็อปของคุณกด URL นี้แทนที่อยู่ DNS สาธารณะของอินสแตนซ์ EC2 ของคุณ:
    http://<<Public DNS>>/cgi-bin/hellopyworld.py

    สำหรับฉันนี่คือ:
    http://ec2-174-129-110-23.compute-1.amazonaws.com/cgi-bin/hellopyworld.py

ขั้นตอนที่ 5: แค่นั้นแหละ! ทำความสะอาดและขอบพระคุณ!

  • หากต้องการออกจากคำสั่ง "sudo / bin / bash" ที่ให้ไว้ก่อนหน้านี้ให้พิมพ์:
    exit

  • กิตติกรรมประกาศ: จำนวนมากขอบคุณ:

    wiki.vpslink.com/Install_and_Configure_lighttpd

    www.cyberciti.biz/tips/lighttpd-howto-setup-cgi-bin-access-for-perl-programs.html

    aws.typepad.com/aws/2010/06/building-three-tier-architectures-with-security-groups.html

  • ขอให้โชคดีมีโก้! ฉันขอโทษสำหรับลักษณะที่ไม่ใช่แบบดั้งเดิมของ "คำถาม" นี้ แต่ฉันได้รับความช่วยเหลือมากมายจาก Stackoverflow ที่ฉันอยากจะคืนบางสิ่งบางอย่าง


4
ฉันปรบมือให้คุณสำหรับการโพสต์คำแนะนำ แต่สำหรับการถามคำถาม ฉันขอแนะนำ blogspot หรือสิ่งที่คล้ายกันสำหรับเรื่องนี้ ถ้าคุณอยากจะให้กลับไปคุณควรตอบคำถาม :)

ฉันส่งว่า "วิธีการ" มีคำถามโดยนัยคือ "ฉันจะทำ X ได้อย่างไร" ในอนาคตฉันจะระบุคำถามอย่างชัดเจนแม้ว่าในตอนแรกจะดูเหมือนโอ้อวด แต่เนื่องจากอาจช่วยค้นหาและหลีกเลี่ยงความสับสนในผู้อ่านตอนนี้ฉันคิดว่ามันคุ้มค่า ขอบคุณ

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

@ user595585 การปฏิบัติที่ได้รับอนุมัติคือการถามคำถาม "ฉันจะทำอย่างไร" และตอบคำถามด้วยตัวเอง คุณยังได้รับตัวแทนมากขึ้นสำหรับปัญหาของคุณในลักษณะที่ โปรดดูคำถามที่พบบ่อย "นอกจากนี้ยังเป็นการสมบูรณ์แบบที่จะถามและตอบคำถามของคุณเองตราบใดที่คุณแสร้งทำว่าคุณอยู่ในอันตราย: วลีในรูปแบบของคำถาม"
C. Ross

3
@user แก้ไขคำถามของคุณเพื่อให้เป็นคำถามจากนั้นตอบคำถามพร้อมรายละเอียดทั้งหมดที่คุณให้ไว้ นอกจากนี้ให้วางบางส่วนของ parens คุณกำลังพูดถึงการโฮสต์ python บน EC2 ไม่ใช่ lisp
ฉีก

คำตอบ:


3

(โพสต์แปลก ๆ ดังนั้นหวังว่านี่จะไม่เป็นคำตอบที่แปลก)

ในเรื่องของข้อบกพร่องด้านความปลอดภัย: ถือว่าเป็นการปฏิบัติที่ไม่ดีโดยทั่วไปในการจัดเก็บสคริปต์ cgi-bin ภายในรูทเอกสารของเว็บเซิร์ฟเวอร์ แม้แต่ W3C ก็ยังอยู่ภายใต้ "เป็นภาษาที่คอมไพล์อย่างปลอดภัยกว่า ... " ในWorld Wide Web Security คำถามที่พบบ่อย :

พิจารณาสถานการณ์สมมติต่อไปนี้ เพื่อความสะดวกคุณได้ตัดสินใจระบุสคริปต์ CGI ไปยังเซิร์ฟเวอร์โดยใช้ส่วนขยาย. cgi หลังจากนั้นคุณต้องทำการเปลี่ยนแปลงเล็กน้อยในสคริปต์ CGI ที่แปลความหมาย คุณเปิดขึ้นด้วยโปรแกรมแก้ไขข้อความ Emacs และแก้ไขสคริปต์ น่าเสียดายที่การแก้ไขทิ้งสำเนาสำรองของซอร์สโค้ดสคริปต์ไว้รอบ ๆ ในแผนผังเอกสาร แม้ว่าผู้ใช้รีโมตไม่สามารถรับซอร์สโค้ดได้โดยดึงสคริปต์เองตอนนี้เขาสามารถรับสำเนาสำรองโดยร้องขอ URL แบบสุ่ม:

    http://your-site/a/path/your_script.cgi~

(นี่เป็นอีกเหตุผลที่ดีในการ จำกัด สคริปต์ CGI ให้กับ cgi-bin และเพื่อให้แน่ใจว่า cgi-bin แยกจากรูทเอกสาร)

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

เพื่อลดสิ่งนี้คุณสามารถเพิ่มบรรทัดต่อไปนี้ลงใน lighttpd.conf (หรือการเปลี่ยนแปลงบางอย่างในนั้น) ไปยัง cgi-bin โดยตรงไปยังไดเร็กทอรีที่แยกจากรูทเอกสาร / var / www / lighttpd

$HTTP["url"] =~ "/cgi-bin/" { cgi.assign = ( "" => "" ) }
alias.url = ( "/cgi-bin/" => "/usr/lib/cgi-bin/" )

สิ่งนี้ต้องการทั้งโมดูล cgi และ alias สำหรับ lighttpd

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