公司的自动化项目之一

公司的服务器超多,需要一个用来管理服务器权限的系统。

主要是实现 用一个账号,可以让你登录所有的服务器,也可以让你身无无分文。

就是这样的一个操作的平台。



5-25
数据库的展现已经做完~    下一步把最多ip和账号给显示出来
加载了 chosen 引起了 右下角的点击关闭 把他的js去掉就行了
改变了用户的登录的方式,把session改成cookies
查到的数据,打印到表格里面,并且前面放一个checkbox   可以实现多选,进行删除。
要做的~
量多的话,可以上传一个文本,文本里面都是要清除的账号。
这样的话,就不用一个个的点了。
还有一个就是数据库的备份,然后针对服务器进行数据的分发恢复。
发现一个问题,就是批量查询mailid的时候,特别的慢,打算把数据放到redis里面。


5-27
1  触发后端更新之后,在前端会实时发起ajax的请求,得到的数据主要是 已经完成,没完成的。 另外就是一个进度条的展现。
2  登录的页面不从数据库里面取值,而是从公司的ldap里面取状态。用来统一的验证。
3  各个日志的下载的连接,判断文件大小,要是小的话,专门return到info.html页面里去


6-1到6-7
为了增加性能,加了uwsgi的多线程。 测试结果,会在一个函数内堵塞,不影响其他人的访问别的函数。
用户的判断已经改用数据库取值
改了后端,针对删除的判断,要是有的话,就直接跳出来,不用进行后期的日志的写入
远程控制的界面和功能已经写完了~
后端基本ok,加了一个进度条。 现在想做一个专门处理后端的队列系统。
现在日志的解析还没有压力,等有压力的时候,从后端开始分。
现在的后端更新可以用python auto_manage_kerberos.py -db dbupdate 回头研究下,打印出日志来







自动化运维之 Kerberos 账号信息管理平台_第1张图片


1.Client将之前获得TGT和要请求的服务信息(服务名等)发送给KDC,KDC中的Ticket Granting Service将为Client和Service之间生成一个Session Key用于Service对Client的身份鉴别。然后KDC将这个Session Key和用户名,用户地址(IP),服务名,有效期, 时间戳一起包装成一个Ticket(这些信息最终用于Service对Client的身份鉴别)发送给Service,不过Kerberos协议并没有直接将Ticket发送给Service,而是通过Client转发给Service.所以有了第二步。

2.此时KDC将刚才的Ticket转发给Client。由于这个Ticket是要给Service的,不能让Client看到,所以KDC用协议开始前KDC与Service之间的密钥将Ticket加密后再发送给Client。同时为了让Client和Service之间共享那个秘密(KDC在第一步为它们创建的Session Key), KDC用Client与它之间的密钥将Session Key加密随加密的Ticket一起返回给Client。

3.为了完成Ticket的传递,Client将刚才收到的Ticket转发到Service. 由于Client不知道KDC与Service之间的密钥,所以它无法算改Ticket中的信息。同时Client将收到的Session Key解密出来,然后将自己的用户名,用户地址(IP)打包成Authenticator用Session Key加密也发送给Service。

4.Service 收到Ticket后利用它与KDC之间的密钥将Ticket中的信息解密出来,从而获得Session Key和用户名,用户地址(IP),服务名,有效期。然后再用Session Key将Authenticator解密从而获得用户名,用户地址(IP)将其与之前Ticket中解密出来的用户名,用户地址(IP)做比较从而验证Client的身份。

5.如果Service有返回结果,将其返回给Client。



kerberos配置的大体流程

大家可以参考下

先配KDC服务器,然后再配Ktelnetd,Krlogind,Krsh服务器,最后就可以使用krb5-workstation提供的telnet,rlogin,rsh来登录这些服务了。下面是安装步骤:
  
  1、生成kerberos的本地数据库
  kdb5_util create -r EXAMPLE.COM -s
  这个命令用来生成kerberos的本地数据库,包括几个文件:principal,principal.OK,principal.kadm5,principal.kadm5.lock. -r 指定realm(kerberos术语),我们随便取一个叫EXAMPLE.COM.
  
  2、生成账号
   kerberos用principal(kerberos术语)来表示realm下的一个帐户,表示为primary/instance@realm,举个例子就是username/[email protected],这里假设9.181.92.90是你机器的ip地址.
  
  在数据库中加入管理员帐户:
  /usr/kerberos/sbin/kadmin.local
  kadmin.local: addprinc admin/[email protected]
  在数据库中加入用户的帐号:
  kadmin.local: addprinc username/[email protected]
  在数据库中加入Ktelnetd,Krlogind,Krshd公用的帐号:
  kadmin.local: addprinc -randkey host/[email protected]
  
  3、检查/var/kerberos/krb5kdc/kadm5.keytab是否有下列语句:
  */[email protected] *
  若没有,那么就添上。
  
  4、修改/etc/krb5.conf文件,修改所有的realm为EXAMPLE.COM,并且加入下列句子
  kdc = 9.181.92.90:88
  admin_server = 9.181.92.90:749
  
  5、在/etc/krb.conf中加入下列语句:
  EXAMPLE.COM
  EXAMPLE.COM 9.181.92.90:88
  EXAMPLE.COM 9.181.92.90:749 admin server
  
  6、启动kdc服务器和Ktelnetd,Krlogind,Krshd
  /etc/init.d/krb5kdc restart
  chkconfig klogin on
  chkconfig kshell on
  chkconfig eklogin on
  chkconfig krb5-telnet on
  /etc/init.d/xinetd restart
  
  7、制作本地缓存
  将username/[email protected]的credentials(kerberos术语)取到本地做为cache,这样以后就可以不用重复输入password了。
  kinit username/9.181.92.90
  如果顺利的话,在/tmp下面会生成文件krb5*;这步如果不通,那么就必须检查以上步骤是否有漏。
  可以用klist命令来查看credential。
  
  8、导出用户密匙
  export host/[email protected]的key到/etc/krb5.keytab,Ktelnetd、Krlogind和Krshd需要/etc/krb5.keytab来验证username/9.181.92.90的身份。
  kadmin.local: ktadd -k /etc/krb5.keytab host/9.181.92.90
  
  9、修改~/.k5login文件
  在其中加入username/[email protected],表示允许username/[email protected]登录该帐户
  
  cat username/[email protected] >>~/.k5login
  
  10、测试kerberos客户端
  krsh 9.181.92.90 -k EXAMPLE.COM ls
  krlogin 9.181.92.90 -k EXAMPLE.COM
  rlogin 9.181.92.90 -k EXAMPLE.COM
  rsh 9.181.92.90 -k EXAMPLE.COM
  telnet -x 9.181.92.90 -k EXAMPLE.COM



ajax 显示进度条的代码



  
    Ajax Progress Bar
    ...
        var xmlHttp;
        var key;
        function createXMLHttpRequest() ...{
            if (window.ActiveXObject) ...{
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            else if (window.XMLHttpRequest) ...{
                xmlHttp = new XMLHttpRequest();
            }
        }
        function go() ...{
            createXMLHttpRequest();
            clearBar();
            var url = "ProgressBarServlet?task=create";
            var button = document.getElementById("go");
            button.disabled = true;
            xmlHttp.open("GET", url, true);
            xmlHttp.onreadystatechange = goCallback;
            xmlHttp.send(null);
        }
        function goCallback() ...{
            if (xmlHttp.readyState == 4) ...{
                if (xmlHttp.status == 200) ...{
                    setTimeout("pollServer()", 2000);
                }
            }
        }
                                                                                                                                                                                                                                                                        
        function pollServer() ...{
            createXMLHttpRequest();
            var url = "ProgressBarServlet?task=poll&key=" + key;
            xmlHttp.open("GET", url, true);
            xmlHttp.onreadystatechange = pollCallback;
            xmlHttp.send(null);
        }
                                                                                                                                                                                                                                                                        
        function pollCallback() ...{
            if (xmlHttp.readyState == 4) ...{
                if (xmlHttp.status == 200) ...{
                    var percent_complete = xmlHttp.responseXML.getElementsByTagName("percent")[0].firstChild.data;
                    var progress = document.getElementById("progress");
                    var progressPersent = document.getElementById("progressPersent");
     progress.width = percent_complete + "%";
     progressPersent.innerHTML = percent_complete + "%";
                    if (percent_complete < 100) ...{
                        setTimeout("pollServer()", 2000);
                    } else ...{
                        document.getElementById("complete").innerHTML = "Complete!";
                        //document.getElementById("go").disabled = false;
                    }
                }
            }
        }
 function clearBar() ...{
   var progress_bar = document.getElementById("progressBar");
   var progressPersent = document.getElementById("progressPersent");
   var complete = document.getElementById("complete");
   progress_bar.style.visibility = "visible"
   progressPersent.innerHTML = " ";
   complete.innerHTML = "Begin to upload this file...";
 }
    
  



  
    86%
  
  
    
 
  
    
 
              
                 
              
            
  


  
  
    completed
  



cookie的配置


#!/usr/bin/env python
#coding=utf-8
                                                                                                                                                                                                                                 
from flask import Flask,url_for,request,render_template,redirect,abort,escape,session
from werkzeug import secure_filename
                                                                                                                                                                                                                                 
print __name__
app = Flask(__name__)
app.secret_key = 'hello'
                                                                                                                                                                                                                                 
@app.route('/')
def index():
    return "hello flask"
                                                                                                                                                                                                                                 
@app.route('/user/')
def show_username(username):
    return username
                                                                                                                                                                                                                                 
@app.route('/post/')
def show_post(post_id):
    return 'post_id:%d' % post_id
                                                                                                                                                                                                                                 
#if you visit /projects will redirect /projects/
@app.route('/projects/')
def projects():
    return 'the project page'
                                                                                                                                                                                                                                 
#if you visit /about/ will return 404 error
@app.route('/about')
def about():
    return 'the about page'
                                                                                                                                                                                                                                 
@app.route('/upload/',methods=['GET','POST'])
def upload_file():
    if request.method == 'POST':
        f = request.files['the_file']
        f.save('./'+secure_filename(f.filename))
        return secure_filename(f.filename)
    else:
        return render_template('upload_file.html')
                                                                                                                                                                                                                                 
@app.route('/redirect/')
def test_redirect():
    return redirect(url_for('test_error'))
                                                                                                                                                                                                                                 
@app.route('/test_error/')
def test_error():
    #中断请求,并返回错误码
    abort(404)
                                                                                                                                                                                                                                 
@app.errorhandler(404)
def page_not_found(error):
    print error
    return render_template('page_not_found.html'),404
                                                                                                                                                                                                                                 
@app.route('/index/')
def test_session():
    if 'username' in session:
        return 'logged in as %s' % escape(session['username'])
    return redirect(url_for('login'))
                                                                                                                                                                                                                                 
@app.route('/login/',methods=['GET','POST'])
def login():
    if request.method == 'POST':
        session['username'] = request.form['username']
        return redirect(url_for('test_session'))
    else:
        return '''
        
        
        
        
        '''
@app.route('/logout/')
def logout():
    session.pop('username',None)
    return redirect(url_for('test_session'))
                                                                                                                                                                                                                                 
with app.test_request_context():
    print url_for('index')
    print url_for('index',next='/')
    print url_for('show_username',username='alex')
                                                                                                                                                                                                                                 
@app.route('/setcookie')
def set_cookie():
    if 'num' in request.cookies:
        count = int(request.cookies['num']) + 1
    else:
        count = 0
                                                                                                                                                                                                                                 
    #每个view最后返回的都是response对象,render_template内部做了处理
    #也可以这样表示response = make_response(render_template('index.html', count=100))
    #不设置max_age和expires时,默认是会话cookie,浏览器关闭后cookie就失效
    #domain可以设置跨域cookie,如domain=".example.com",这样cookie可以 被"www.example.com,alex.example.com"共享
    response = app.make_response(str(count))
    response.set_cookie('num',value=count,max_age=None,expires=None,domain=None)
    return response
                                                                                                                                                                                                                                 
if __name__ == '__main__':
    app.run(host="localhost",port=8888,debug=True)



python管理kerberos的库的用法

import kerberos
import httplib
# setup kerb
_ignore, ctx = authGSSClientInit(‘[email protected]’, gssflags=GSS_C_DELEG_FLAG|GSS_C_MUTUAL_FLAG|GSS_C_SEQUENCE_FLAG)
_ignore = authGSSClientStep(ctx, ”)
tgt = authGSSClientResponse(ctx)
# setup http connection
servername, port = (‘myhost.exmple.com’, 443)
h = httplib.HTTPSConnection(servername, port)
h.connect()
# Setup Headers
http_conn.putrequest(“GET”, “/XMLRPC/”)
if tgt:
h.putheader(‘Authorization’, ‘Negotiate %s’ % tgt)
h.endheaders()
# Make http call
resp = http_conn.getresponse()
if resp.status != 200:
print “Error: %s” % str(resp.status)
return None
#Check for kerb header
krb_reply = resp.getheader(‘WWW-Authenticate’)
if not krb_reply:
print “Server did not send kerberos reply”
return None
# print html contents
print resp.read()


python ldap的操作的实例

def ldap_getcn(username):
    try:
        l = ldap.open(LDAP_HOST)
        l.protocol_version = ldap.VERSION3
        l.simple_bind(LDAP_BIND, LDAP_PASS)
        searchScope = ldap.SCOPE_SUBTREE
        searchFilter = "uid=*" + username + "*"
        resultID = l.search(LDAP_BASE, searchScope, searchFilter, None)
        result_set = []
        while 1:
            result_type, result_data = l.result(resultID, 0)
            if (result_data == []):
                break
            else:
                if result_type == ldap.RES_SEARCH_ENTRY:
                    result_set.append(result_data)
        return result_set[0][0][1]['cn'][0]
    except ldap.LDAPError, e:
        print e


自动化运维之 Kerberos 账号信息管理平台_第2张图片

自动化运维之 Kerberos 账号信息管理平台_第3张图片


自动化运维之 Kerberos 账号信息管理平台_第4张图片


自动化运维之 Kerberos 账号信息管理平台_第5张图片

自动化运维之 Kerberos 账号信息管理平台_第6张图片



自动化运维之 Kerberos 账号信息管理平台_第7张图片


自动化运维之 Kerberos 账号信息管理平台_第8张图片


自动化运维之 Kerberos 账号信息管理平台_第9张图片


自动化运维之 Kerberos 账号信息管理平台_第10张图片

自动化运维之 Kerberos 账号信息管理平台_第11张图片

自动化运维之 Kerberos 账号信息管理平台_第12张图片

自动化运维之 Kerberos 账号信息管理平台_第13张图片

自动化运维之 Kerberos 账号信息管理平台_第14张图片

自动化运维之 Kerberos 账号信息管理平台_第15张图片