在使用OpenLDAP作为集中式认证之后会发现OpenLDAP下的所有用户都可以登录服务器,这是相当危险的。因此看到有人使用组来实现OpenLDAP下的用户访问服务器。

1.首先在OpenLDAP服务器建立对应的组

我在ou为group下建立一个opsgroup,opsgroup的gid为23794

OpenLDAP限制用户登录主机_第1张图片

2.我再建立一个用户,或者直接修改一个帐号的主组(primary group).

这里注意用户的主组为opsgroup。

OpenLDAP限制用户登录主机_第2张图片


3.建立一个user2用户不属于该组,是不能登录服务器的以做对比

OpenLDAP限制用户登录主机_第3张图片


4.现在测试

OpenLDAP限制用户登录主机_第4张图片

现在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,否则即便是组下面的用户也是不能登录的

OpenLDAP限制用户登录主机_第5张图片

从上面测试可以看到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,略有改动