PHPカンファレンス福岡で発表したGo言語とSTNSに関する話です。 言語カンファレンスなのですこしだけ技術的な側面に触れています。
ʙීஈPHPॻ͍ͯ·͢ฤʙGoݴޠͰ࣮͢ΔLinuxNameServer
View Slide
hi!GMO Pepabo, Inc.ϗεςΟϯάࣄۀ෦ϜʔϜʔυϝΠϯάϧʔϓγχΞΤϯδχΞ@pyama86
bloghttps://ten-snapon.com
Go 1.5
-buildmode=c-sharedGo 1.5͔ΒCGOΛར༻͠ڞ༗ϥΠϒϥϦΛ࡞Մೳʹhttp://qiita.com/masakielastic/items/09018646d7d34996190a
Go?
ϫϯόΠφϦͰΠέͯΔίϚϯυpeco pt ghq ghr
ઌਐతWeb։ൃʁ
Linux Middleware
Before Go 1.5LinuxͷOSϨΠϠͷ༷Λม͑Δʹɺਂ͘ͳΕͳΔ΄ͲCݴޠͷ΄΅ಠஃͰ͋ͬͨͱࢥ͏
After Go 1.5GoݴޠΛ༻͍ͯɺLightweight LanguageͷΑ͏ͳॻ͖ຯͰɺLinuxOSͷϛυϧΣΞ։ൃ͕Մೳʹͳͬͨpackage main/*#include #include */import "C"//export _nss_stns_getpwnam_rfunc _nss_stns_getpwnam_r(name *C.char, pwd *C.struct_passwd) int {return set(&Passwd{pwd, result}, "user", "name", C.GoString(name))}
STNSLinuxͷϢʔβʔɺάϧʔϓͷ໊લղܾɺೝূػೳΛఏڙ͢ΔLinuxNameService% ls -ltr-rw-r--r-- 1 pyama wheel 0 May 8 00:09 php_fukuoka.txt% ls -ltr-rw-r--r-- 1 1000 1000 0 May 8 00:09 php_fukuoka.txtid:1000 to pyamaͷ໊લղܾ
STNSͷഎܠ1.DevOpsɺσϓϩΠڥͷભҠʹΑͬͯSSHϩάΠϯ͕ඞཁͳϢʔβʔͷ૿Ճ2.Ϣʔβʔ૿Ճ࿈ܞઌ૿Ճʹ͍ഁ͔͚ͨ͠LDAP͔ΒͷҠߦઌ3.ͱʹ͔͘ͱ͍͏࠽ೳΛӡ༻ཧͱ͔ʹ͍ͨ͘ͳ͔ͬͨ
ίϯηϓτ໊લղܾɺެ։伴औಘɺsudoೝূͷΈΛఏڙ͢Δɻଟ͘ΛΒͣɺγϯϓϧʹอͭ͜ͱͰཧɺΈ߹ΘͤΛ༰қʹɻhttps://github.com/STNS/STNS
ΞʔΩςΫνϟSTNShttp(1104)Clientlslibnss-stnslibpam-stnsquery-wrapperkey-wrapper/user/name/pyama{name:pyama,id: 1000,dir:/home/pyama…}
nssNetwork Security Servicelibnss_.so.2(version)ͷϥΠϒϥϦΛಡΈࠐΈɺ໋໊نʹ߹கͨ͠γϯϘϧ͕ଘࡏ͢Δ߹ίʔϧͯ͘͠ΕΔhttp://www.gnu.org/software/libc/manual/html_node/NSS-Modules-Interface.html
nsspasswd_nss_stns_getpwnam_r_nss_stns_getpwuid_r_nss_stns_setpwent_nss_stns_endpwent_nss_stns_getpwent_rgroup_nss_stns_getgrnam_r_nss_stns_getgrgid_r_nss_stns_setgrent_nss_stns_endgrent_nss_stns_getgrent_rshadow_nss_stns_getspnam_r_nss_stns_setspent_nss_stns_endspent_nss_stns_getspent_rlibnss_stns.so͜ͷ໊લͷfunctionΛఆٛ͢Δ͚ͩͰSTNS࡞ΕΔ
stns.conf(αʔό)port = 1104include = "/etc/stns/conf.d/*"# ϕʔγοΫೝূΛαϙʔτuser = "basic_user"password = "basic_password"[users.example]id = 1001group_id = 1001keys = ["ssh-rsa XXXXX…"][groups.example]id = 1001users = ["example"][sudoers.example]password ="9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"hash_type = "sha256"
ࠓ෩ͳػೳ
ΞϓϦέʔγϣϯσϓϩΠ[email protected][email protected][email protected]/home/deploy/.ssh/authrized_keysʹ֤Ϣʔβʔͷެ։伴Λొ
σϓϩΠϢʔβʔͷཧࡢࠓͷWebαʔϏεͰσϓϩΠઐ༻ϢʔβʔΛઃ͚ͯσϓϩΠ͢Δ͜ͱ͕ଟ͍ɻ͔͠͠ɺطଘͷΈͰ࣮ݱ͢ΔʹσϓϩΠϢʔβʔͷ~/.ssh/authorized_keysʹσϓϩΠ͢ΔϢʔβʔͷެ։伴ΛฒͨΓ͢Δඞཁ͕͋ͬͨ
σϓϩΠϢʔβʔͷཧ[users.deploy]id = 1000group_id = 1000link_users = [“example1","example2"][users.foo]keys = ["ssh-rsa aaa”][users.bar]keys = ["ssh-rsa bbb"]deployϢʔβʔͰSSHϩάΠϯ͢Δࡍʹɺlink_usersͰࢦఆͨ͠Ϣʔβʔͷެ։伴Λར༻͢Δ͜ͱ͕ग़དྷΔ→authorized_keysʹॻ͔ͳͯ͘ྑ্͍ʹɺɹ୭͕σϓϩΠग़དྷΔͷ͔Ұྎવ
ͬͯΈΔʁ
ಋೖͷखܰ͞1ίϚϯυͰϦϙδτϦΛՃ͠ɺyumɺaptͰ࠷৽൛Λར༻Մೳ
ಋೖͷखܰ͞puppetϚχϑΣετɺchefΫοΫϒοΫΛఏڙՃ͑ͯຊޠΠϯετʔϧυΩϡϝϯτhttps://github.com/STNS/STNS/blob/master/docs/install_ja.md
ৄࡉઌि౦ژʹஔ͍͖ͯͨhttps://www.youtube.com/watch?v=ZBuEsQ3rnm4
ͯ͞ΓɺGo
CGOʹز੍͔͕ͭ͋Δ1.ڞ༗ϥΠϒϥϦʹग़དྷΔͷmainύοέʔδͷΈ2.CGOtestʹؚΊΒΕͳ͍3.Go 1.5Ͱ32bitͷڞ༗ϥΠϒϥϦ͕αϙʔτ͞Ε͍ͯͳ͍(1.6OK)
LinuxϛυϧΣΞ࡞Δʹ֮ޛ͕͍Δʮ$ ls ~ʯͷΑ͏ʹೖྗޙλϒิͨ͠ࡍʹɺbash͕clone͞Εͯɺΰϧʔνϯ͕ແݶϧʔϓͨ͠Γ
$ strace getent passwd
$ LD_DEBUG=symbols,bindings id
$ vim ldap-pwd.c
࠶ܝͨͩ͠ɺCݴޠͷ࠷ݶͷࣝɺ૬Ԡͷσόοάೳྗඞཁ
ʹͱͬͯGo͕࠷ޙͷҰຕͩͬͨ
GoɾόΠφϦɾڞ௨ϥΠϒϥϦɾαʔόɾΫϩείϯύΠϧɾѹతੜ࢈ੑ
৽͍͠ݴޠͰ৽͍͠ՁΛੜΊͨ