出于安全考慮,大多數公司的辦公環境和業務環境在網絡層面基本上是隔離開的,在辦公環境是無法直接連到業務生產環境的,只有做過特定白名單同性的情況下才會允許這么做。這樣做了,開發人員需要訪問生產環境服務器排查問題或者運維人員通過辦公網絡對生產環境進行維護就不太方便,但是網絡一旦開通又會出現安全風險。
在這種情況下,就需要一種可以控制網絡入口,能夠統一授權,認證的系統,這樣運維跳板機,也就是比較嚴格意義上的AAAA認證系統就出現了。
所謂的4A認證系統其實是指:
統一用戶賬號(Account)
統一認證(Authentication)
統一授權(Authorization)
統一安全審計(Audit)
我們公司使用的是openldap(管理用戶信息,同時實現資源訪問控制),Kerberos(網絡鑒權),google authenticator(二次認證的動態口令),bash (修改源碼,實現賬戶遠程登錄操作
日志記錄)
系統環境: 64位 CentOS linux 6.3
openldap+bdb+phpldapadmin
openldap:
master端:yum 安裝
openldap
openldap-clients
openldap-servers
nss_ldap
客戶端:yum方式
openldap
nss_ldap
slapd.conf配置文件修改:
databasebdb
suffix"dc=dianping,dc=com"
rootdn"cn=ldapadmin,dc=dianping,dc=com"
#Cleartextpasswords,especiallyfortherootdn,should
#beavoid.Seeslappasswd(8)andslapd.conf(5)fordetails.
#Useofstrongauthenticationencouraged.
rootpw!@qwaszx
#ThedatabasedirectoryMUSTexistpriortorunningslapdAND
#shouldonlybeaccessiblebytheslapdandslaptools.
#Mode700recommended.
directory/usr/local/openldap/var/openldap-data
#Indicestomaintain
indexobjectClasseq
#indexuidNumbereq
serverid3ldap://server1
serverid5ldap://server2
cachesize50000
checkpoint10245
idletimeout20
syncreplrid=005
provider=ldap://server2
binddn="cn=ldapadmin,dc=dianping,dc=com"
bindmethod=simple
credentials=hehehehhe,qunying.liu
searchbase="dc=dianping,dc=com"
type=refreshAndPersist
interval=00:00:00:10
retry="553005"
timeout=1
mirrormodetrue
overlaysyncprov
syncprov-checkpoint10010
syncprov-sessionlog100
sizelimit700
timelimit20
databasemonitor
系統加入ldap認證:
vi/etc/nsswitch.conf
passwd:filesldap
shadow:filesldap
group:filesldap
打開ldap服務日志:
syslog中加入ldap日志文件
vi/etc/syslog.conf
#saveOpenLDAPlog
local4.*/var/log/ldap.log
客戶端修改 /etc/ldap.conf
hostserver1
#Thedistinguishednameofthesearchbase.
baseou=ldap,ou=auth,dc=dianping,dc=com
Openldapadmin配置
Tarzxvfopenldapadmin-1.2.3.tar.gz
Cdopenldapadmin-1.2.3
mvphpldapadmin-1.2.3/var/www/localhost/htdocs/phpldapadmin–r
cd/var/www/localhost/htdocs/phpldapadmin
cpconfig/config.php.exampleconfig/config.php
修改config.php文件
登錄phpldapadmin,設置的登錄密碼(hehehehhe,qunying.liu)登錄
Kerberos:
Kerberos認證協議
Kerberos是一種網絡認證協議,其設計目標是通過密鑰系統為客戶機 / 服務器應用程序提供強大的認證服務。
使用Kerberos時,一個客戶端需要經過三個步驟來獲取服務:
認證:客戶端向認證服務器發送一條報文,并獲取一個含時間戳的Ticket-Granting Ticket(TGT)。
授權:客戶端使用TGT向Ticket-Granting Server(TGS)請求一個服務Ticket。
服務請求:客戶端向服務器出示服務Ticket,以證實自己的合法性。該服務器提供客戶端所需服務,在Hadoop應用中,服務器可以是namenode或jobtracker。
為此,Kerberos需要The Key Distribution Centers(KDC)來進行認證。KDC只有一個Master,可以帶多個slaves機器。slaves機器僅進行普通驗證。Mater上做的修改需要自動同步到slaves。
另外,KDC需要一個admin,來進行日常的管理操作。這個admin可以通過遠程或者本地方式登錄。
搭建Kerberos
1.安裝:通過yum安裝即可,組成KDC。
yuminstall-ykrb5-serverkrb5-libkrb5-workstation
2.配置:Kerberos的配置文件只有兩個。在server1中創建以下兩個文件,并同步/etc/krb5.conf到所有機器。
/var/kerberos/krb5kdc/kdc.conf:包括KDC的配置信息。默認放在 /usr/local/var/krb5kdc。或者通過覆蓋KRB5_KDC_PROFILE環境變量修改配置文件位置。
配置示例:
[kdcdefaults]
kdc_ports=88
kdc_tcp_ports=88
[realms]
Qunying.liu={
master_key_type=aes128-cts
acl_file=/var/kerberos/krb5kdc/kadm5.acl
dict_file=/usr/share/dict/words
admin_keytab=/var/kerberos/krb5kdc/kadm5.keytab
max_renewable_life=7d
supported_enctypes=aes128-cts:normaldes3-hmac-sha1:normalarcfour-hmac:normaldes-hmac-sha1:normaldes-cbc-md5:normaldes-cbc-crc:normal
}
說明:
QUNYING.LIU:是設定的realms。名字隨意。Kerberos可以支持多個realms,會增加復雜度。大小寫敏感,一般為了識別使用全部大寫。這個realms跟機器的host沒有大關系。
max_renewable_life=7d涉及到是否能進行ticket的renwe必須配置。
master_key_type:和supported_enctypes默認使用aes256-cts。由于,JAVA使用aes256-cts驗證方式需要安裝額外的jar包。推薦不使用。
acl_file:標注了admin的用戶權限,需要用戶自己創建。文件格式是
Kerberos_principalpermissions[target_principal][restrictions]
支持通配符等。最簡單的寫法是
代表名稱匹配*/admin@QUNYING.LIU都認為是admin,權限是*。代表全部權限。
admin_keytab:KDC進行校驗的keytab。后文會提及如何創建。
supported_enctypes:支持的校驗方式。注意把aes256-cts去掉。
/etc/krb5.conf:包含Kerberos的配置信息。例如,KDC的位置,Kerberos的admin的realms 等。需要所有使用的Kerberos的機器上的配置文件都同步。這里僅列舉需要的基本配置。詳細介紹參考:krb5conf:http://web.mit.edu/~kerberos/krb5-devel/doc/admin/conf_files/krb5_conf.html
配置示例:
[logging]
default=FILE:/var/log/krb5libs.log
kdc=FILE:/var/log/krb5kdc.log
admin_server=FILE:/var/log/kadmind.log
[libdefaults]
default_realm=QUNYING.LIU
dns_lookup_realm=false
dns_lookup_kdc=false
ticket_lifetime=24h
renew_lifetime=7d
max_life=12h0m0s
forwardable=true
udp_preference_limit=1
[realms]
QUNYING.LIU={
kdc=server1:88
admin_server=server1:749
default_domain=DIANPING.COM
}
[appdefaults]
說明:
[logging]:表示server端的日志的打印位置
[libdefaults]:每種連接的默認配置,需要注意以下幾個關鍵的小配置
default_realm=QUNYING.LIU默認的realm,必須跟要配置的realm的名稱一致。
udp_preference_limit=1禁止使用udp可以防止一個Hadoop中的錯誤
[realms]:列舉使用的realm。
kdc:代表要kdc的位置。格式是機器:端口
admin_server:代表admin的位置。格式是機器:端口
default_domain:代表默認的域名
[appdefaults]:可以設定一些針對特定應用的配置,覆蓋默認配置。
初始化并啟動:完成上面兩個配置文件后,就可以進行初始化并啟動了。
A.初始化數據庫:在server1上運行命令。其中-r指定對應realm。
kdb5_utilcreate-rQUNYING>LIU-s
如果遇到數據庫已經存在的提示,可以把/var/kerberos/krb5kdc/目錄下的principal的相關文件都刪除掉。默認的數據庫名字都是principal。可以使用-d指定數據庫名字。(尚未測試多數據庫的情況)。
B.啟動kerberos。如果想開機自啟動,需要stash文件。
/usr/local/sbin/krb5kdc
/usr/local/sbin/kadmind
至此kerberos,搭建完畢。
測試kerberos,搭建完畢后,進行以下步驟測試Kerberos是否可用。
A. 進入kadmin在kadmin上添加一個超級管理員賬戶,需要輸入passwd
kadmin.local
addprincadmin/admin
B. 在其它機器嘗試通過kadmin連接,需要輸入密碼
kinitadmin/admin
kadmin
如果能成功進入,則搭建成功。
kerberos日常操作
管理員操作
登錄到管理員賬戶: 如果在本機上,可以通過kadmin.local直接登錄。其它機器的,先使用kinit進行驗證。
kadmin.local
kinitadmin/admin
kadmin
增刪改查賬戶:在管理員的狀態下使用addprinc,delprinc,modprinc,listprincs命令。使用?可以列出所有的命令。
kamdin:addprinc-randkeyhdfs/hadoop1
kamdin:delprinchdfs/hadoop1
kamdin:listprincs命令
生成keytab:使用xst命令或者ktadd命令
kadmin:xst-k/xxx/xxx/kerberos.keytabhdfs/server1
用戶操作
查看當前的認證用戶:klist
認證用戶:kinit-kt/xx/xx/kerberos.keytabhdfs/server1
刪除當前的認證的緩存:kdestroy
google authenticator:
基于TOTP(Time-based One-time Password,基于時間的一次性密碼)
TOTP(基于時間的一次性密碼算法)是支持時間作為動態因素基于HMAC一次性密碼算法的擴展。
http://tools.ietf.org/html/rfc6238
條件:
1)Prover與Verifier之間必須時鐘同步;
2)Prover與Verifier之間必須共享密鑰;
3)Prover與Verifier之間必須使用相同的時間步長
算法:
K 共享密鑰
T 時間
T0 開始計數的時間步長
X 時間步長
TOTP = Truncate(HMAC-SHA-1(K, (T – T0) / X))
使用Google Authenticator的步驟:
1. 服務器端對每個用戶生成一個唯一的密鑰SecretKey。
2. 用戶在手機上安裝Google Authenticator。首次使用需要將密鑰輸入到Google Authenticator。可通過手動和掃描系統生成的二維碼等兩種方式輸入密鑰信息。
3. Google Authenticator每隔一段時間為系統自動生成一個新的密碼。用戶在輸入口令前需先輸入生成的動態驗證碼。
客戶端實現
python實現:
#!/usr/bin/envpython
#-*-coding:utf-8-*-
importhmac,base64,struct,hashlib,time,sys,os
defget_hotp_token(secret,intervals_no):
key=base64.b32decode(secret)
msg=struct.pack(">Q",intervals_no)
h=hmac.new(key,msg,hashlib.sha1).digest()
o=ord(h[19])&15
h=(struct.unpack(">I",h[o:o+4])[0]&0x7fffffff)%1000000
returnh
defget_totp_token(secret):
returnget_hotp_token(secret,intervals_no=int(time.time())//30)
#Sec=str(sys.argv[1])
Sec='xxxxxxx'
validation_code=str(get_totp_token(Sec))
printvalidation_code
ruby實現:
#!/usr/bin/ruby
require'rubygems'
require'base32'
require'openssl'
int=30
now=Time.now.to_i/int
key=Base32.decode'xxxxxxxx'
sha=OpenSSL::Digest::Digest.new('sha1')
(-1..1).eachdo|x|
bytes=[now+x].pack('>q').reverse
hmac=OpenSSL::HMAC.digest(sha,key.to_s,bytes)
offset=hmac[-1]&0x0F
hash=hmac[offset…offset+4]
code=hash.reverse.unpack('L')[0]
code&=0x7FFFFFFF
code%=1000000
putscode
end
跳板機登錄增加谷歌二次認證
Google Authenticator模塊安裝:
EPEL源安裝: yum install libpam-google-authenticator
2.源碼安裝:
yuminstallmakegccpam-devel
#cd/tmp
#wgethttp://google-authenticator.googlecode.com/files/libpam-google-authenticator-1.0-source.tar.bz2
#bunzip2libpam-google-authenticator-1.0-source.tar.bz2
#tarxflibpam-google-authenticator-1.0-source.tar
#cdlibpam-google-authenticator-1.0
#make
gcc–std=gnu99-Wall-O2-g-fPIC-c-fvisibility=hidden-ogoogle-authenticator.ogoogle-authenticator.c
gcc–std=gnu99-Wall-O2-g-fPIC-c-fvisibility=hidden-obase32.obase32.c
gcc–std=gnu99-Wall-O2-g-fPIC-c-fvisibility=hidden-ohmac.ohmac.c
gcc–std=gnu99-Wall-O2-g-fPIC-c-fvisibility=hidden-osha1.osha1.c
gcc-g-ogoogle-authenticatorgoogle-authenticator.obase32.ohmac.osha1.o-ldl
gcc–std=gnu99-Wall-O2-g-fPIC-c-fvisibility=hidden-opam_google_authenticator.opam_google_authenticator.c
gcc-shared-g-opam_google_authenticator.sopam_google_authenticator.obase32.ohmac.osha1.o-lpam
gcc–std=gnu99-Wall-O2-g-fPIC-c-fvisibility=hidden-odemo.odemo.c
gcc-DDEMO–std=gnu99-Wall-O2-g-fPIC-c-fvisibility=hidden-opam_google_authenticator_demo.opam_google_authenticator.c
gcc-g-rdynamic-odemodemo.opam_google_authenticator_demo.obase32.ohmac.osha1.o-ldl
gcc-DTESTING–std=gnu99-Wall-O2-g-fPIC-c-fvisibility=hidden
-opam_google_authenticator_testing.opam_google_authenticator.c
gcc-shared-g-opam_google_authenticator_testing.sopam_google_authenticator_testing.obase32.ohmac.osha1.o-lpam
gcc–std=gnu99-Wall-O2-g-fPIC-c-fvisibility=hidden-opam_google_authenticator_unittest.opam_google_authenticator_unittest.c
gcc-g-rdynamic-opam_google_authenticator_unittestpam_google_authenticator_unittest.obase32.ohmac.osha1.o-lc-ldl
#makeinstall
cppam_google_authenticator.so/lib64/security
cpgoogle-authenticator/usr/local/bin
設置Google Authenticator
運行/usr/local/bin/google-authenticator
會在當前帳號home目錄下生成相關配置文件。
Doyouwantmetoupdateyour"~/.google_authenticator"file(y/n)y
https://www.google.com/chart?chs=200×200&chld=M|0&cht=qr&chl=otpauth://totp/user@server%3Fsecret%3DABCD12E3FGHIJKLMN
Yournewsecretkeyis:ABCD12E3FGHIJKLMN
Yourverificationcodeis98765432
Youremergencyscratchcodesare:
01234567
89012345
67890123
45678901
23456789
Doyouwanttodisallowmultipleusesofthesameauthentication
token?Thisrestrictsyoutooneloginaboutevery30s,butitincreases
yourchancestonoticeorevenpreventman-in-the-middleattacks(y/n)y
Bydefault,tokensaregoodfor30secondsandinordertocompensatefor
possibletime-skewbetweentheclientandtheserver,weallowanextra
tokenbeforeandafterthecurrenttime.Ifyouexperienceproblemswithpoor
timesynchronization,youcanincreasethewindowfromitsdefault
sizeof1:30mintoabout4min.Doyouwanttodoso(y/n)y
Ifthecomputerthatyouareloggingintoisn'thardenedagainstbrute-force
loginattempts,youcanenablerate-limitingfortheauthenticationmodule.
Bydefault,thislimitsattackerstonomorethan3loginattemptsevery30s.
Doyouwanttoenablerate-limiting(y/n)y
sshd配置加入谷歌認證模塊:
/etc/pam.d/sshd
#%PAM-1.0
authrequiredpam_google_authenticator.so
authincludesystem-auth
accountrequiredpam_nologin.so
accountincludesystem-auth
passwordincludesystem-auth
sessionoptionalpam_keyinit.soforcerevoke
sessionincludesystem-auth
sessionrequiredpam_loginuid.so
修改/etc/ssh/sshd_config
加入hallengeResponseAuthenticationyes
本地網絡登錄帳號跳過谷歌認證模塊設置:
/etc/pam.d/sshd 增加
auth[success=1default=ignore]pam_access.soaccessfile=/etc/security/access-local.conf
authrequiredpam_google_authenticator.so
在/etc/security/access-local.conf文件中增加:
#GoogleAuthenticatorcanbeskippedonlocalnetwork
+:ALL:192.168.0.0/24
+:ALL:LOCAL
-:ALL:ALL
允許192.196.0.0網段的用戶登錄帳號時跳過谷歌認證步驟。
整個跳板機部署完畢后,用戶如何登錄對于很多開發人員完全未知,站在用戶的角度我們進行了一次內部分享,對如何登錄跳板機做了簡要說明。
當然較于現在出現的比較高大上的堡壘機而言,運維跳板機的功能還是相當簡單,只實現了用戶信息和權限管理的統一,同時也只是事后的安全審計,目前還不能事前控制以避免人員的誤操作。堡壘機一般支持的協議有圖形(RDP/VNC/X11)、字符(SSH/TELNET)、文件(FTP/SFTP)和一些數據庫協議(MySQL、Oracle)等等。除此之外,除了未實現高端的圖形界面顯示和一些比較人性化的交互功能外,目前大部分的功能(比如單點登錄,審計,帳號管理,操作也可以定位到來源和人員)我們都是具有的。