OpenLDAP限制用戶登錄主機

在使用OpenLDAP作爲集中式認證之後會發現OpenLDAP下的所有用戶都可以登錄服務器,這是相當危險的。因此看到有人使用組來實現OpenLDAP下的用戶訪問服務器。

1.首先在OpenLDAP服務器建立對應的組

我在ou爲group下建立一個opsgroup,opsgroup的gid爲23794

wKioL1fOXCvgDaXbAAEA5yK4gUY610.png

2.我再建立一個用戶,或者直接修改一個帳號的主組(primary group).

這裏注意用戶的主組爲opsgroup。

wKioL1fOXfjAZztGAAHlMdxcXkc915.png


3.建立一個user2用戶不屬於該組,是不能登錄服務器的以做對比

wKiom1fOXsiBW2d-AACXC6cqwTk058.png


4.現在測試

wKioL1fOX4jRLyPeAACb0lIuChE128.png

現在user1、user2都可以登錄客戶機


5.注意我客戶機是CentOS 6.8,如果是CentOS 5.x的版本略有差異

echo "filter passwd (gidNumber=23794)" >>/etc/nslcd.conf
/etc/init.d/nslcd restart

以上配置爲gid爲23794的組可以登錄服務器,也就是opsgroup的組用戶可以登錄

注意:可以登錄服務器的用戶一定要是主組爲opsgroup,否則即便是組下面的用戶也是不能登錄的

wKioL1fOYSDCj3FnAACTNtvGBng576.png

從上面測試可以看到user1可以正常登錄,而主組不是opsgroup的user2是不能登錄的,通過控制組來限制用戶登錄服務器


6.腳本自動實現判斷

#!/bin/bash
function get_gid() {
    ldapsearch -x gidNumber -b "cn=$1,ou=group,dc=vxuepin,dc=com" 2>/dev/null | grep "^gidNumber" | awk '{print $2}'
}

function filter_on_centos5() {
    #samples:
    #nss_base_passwd    dc=vxuepin,dc=com?sub?gidNumber=1000
    #nss_base_passwd    dc=vxuepin,dc=com?sub?|(gidNumber=1000)(gidNumber=1003)
    cp /etc/ldap.conf /etc/ldap.conf.`date +%Y%m%d`
    local groups="$1"
    echo "***** Getting filter *****"
    n=$(echo $groups | awk -F',' '{print NF}')
    if [ $n -eq 1 ];then
        gid=$(get_gid $groups)
        [ -z $gid ] && { echo "Can't find group $1"; exit 3; }
        filter="gidNumber=$gid"
    else
        filter="|"
        for group in $(echo $groups | sed 's/,/ /g'); do
            gid=$(get_gid $group)
            [ -z $gid ] && { echo "Can't find group $group"; exit 3; }
            filter="$filter""(gidNumber=$gid)"
        done
    fi
    filter="nss_base_passwd dc=vxuepin,dc=com?sub?""$filter"
    echo $filter
    echo "***** Config ldap.conf *****"
    echo $filter >> /etc/ldap.conf
}

function filter_on_centos6() {
    #samples:
    #filter passwd (gidNumber=1000)
    #filter passwd (|(gidNumber=1000)(gidNumber=1003))
    cp /etc/nslcd.conf /etc/nslcd.conf.`date +%Y%m%d`
    local groups="$1"
    echo "***** Getting filter *****"
    n=$(echo $groups | awk -F',' '{print NF}')
    if [ $n -eq 1 ];then
        gid=$(get_gid $groups)
        [ -z $gid ] && { echo "Can't find group $1"; exit 3; }
        filter="(gidNumber=$gid)"
    else
        filter="(|"
        for group in $(echo $groups | sed 's/,/ /g'); do
            gid=$(get_gid $group)
            [ -z $gid ] && { echo "Can't find group $group"; exit 3; }
            filter="$filter""(gidNumber=$gid)"
        done
        filter="$filter"")"
    fi
    filter="filter passwd $filter"
    echo $filter
    echo "***** Restart nslcd *****"
    echo $filter >> /etc/nslcd.conf
    service nslcd restart
}

if [ -z $1 ];then
echo "please input groupname";
exit 1
fi

if [ `uname -r|grep el6|wc -l` -eq 1 ]; then
filter_on_centos6 $1;
elif [ `uname -r|grep el5|wc -l` -eq 1 ]; then
filter_on_centos5 $1;
else
echo "os unsupport!";
fi

以上腳本參考http://opjasee.com/2016/01/24/openldap-group-filter.html,略有改動



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章