zoukankan      html  css  js  c++  java
  • Samba通过ad域进行认证并限制空间大小

    本文实现了samba服务被访问的时候通过windows域服务器进行用户名和密码验证;认证通过的用户可以自动分配500M的共享空间;在用户通过windows域登陆系统的时候可以自动把这块空间映射成一块硬盘。
    环境说明:
    文件服务器用的Centos5.3,域控用的Win2k3 sp2,Domain是rainbird.net。
    Centos5.3:
    Name:Filesrv
    IP:192.168.1.245
    Dns:192.168.1.241
    Samba:3.0.33-3.7.el5
    Win2k3:
    Name:ad1
    Ip:192.168.1.241
    Dns:192.168.1.241
    Ok,let’s move!
    因为是服务器配置,所以本文的操作都是在字符界面下直接编辑文件。当然为了提高工作效率其中一部分配置是可以在图形界面下配的。前提是你必须是redhat/centos系统。如果是的话,可以参考我上一篇文章<<linux加入windows域之完美方案>>来做J
    1.samba服务器软件需求
    krb5-workstation-1.2.7-19
    pam_krb5-1.70-1
    krb5-devel-1.2.7-19
    krb5-libs-1.2.7-19
    samba-3.0.5-2
    [root@filesrv CentOS]# rpm -qa|grep krb5
    krb5-auth-dialog-0.7-1
    krb5-libs-1.6.1-25.el5
    krb5-devel-1.6.1-25.el5
    pam_krb5-2.2.14-1
    krb5-workstation-1.6.1-25.el5
    [root@filesrv CentOS]# rpm -qa|grep samba
    samba-swat-3.0.28-0.el5.8
    samba-common-3.0.28-0.el5.8
    samba-client-3.0.28-0.el5.8
    samba-3.0.28-0.el5.8
     
    如果centos在安装的时候没有取消默认选中的”Base”,则krb5的包是默认全部安装
    如果没有选择安装samba可以这样安装
    [root@filesrv CentOS]# rpm -ivh xinetd-2.3.14-10.el5.i386.rpm
    [root@filesrv CentOS]# rpm -ivh --aid samba*.rpm

    2.配置kerberos(关键)
    下面配置参数让 Kerberos 进程知道处理活动目录服务器,对 /etc/krb5.conf 做适当的修改,修改时需要注意的是 Kerberos 是大小写敏感的。
    这是我的krb5.conf配置文件:
    [logging]
    default = FILE:/var/log/krb5libs.log
    kdc = FILE:/var/log/krb5kdc.log
    admin_server = FILE:/var/log/kadmind.log

    [libdefaults]
    ticket_lifetime = 24000
    default_realm = RAINBIRD.NET //默认域名
    dns_lookup_realm = false
    dns_lookup_kdc = false

    [realms]
    RAINBIRD.NET = {
    kdc = 192.168.1.241:88 //域服务器ip
    # admin_server = kerberos.example.com:749
    default_domain = RAINBIRD.NET
    }

    [domain_realm]
    . rainbird.net = RAINBIRD.NET
    rainbird.net = RAINBIRD.NET

    [kdc]
    profile = /var/kerberos/krb5kdc/kdc.conf

    [appdefaults]
    pam = {
    debug = false
    ticket_lifetime = 36000
    renew_lifetime = 36000
    forwardable = true
    krb4_convert = false
    }

    3.测试kerberos
    kinit administrator@RAINBIRD.NET
    kinit 命令将测试服务器间的通信,administrator为域内存在的用户, RAINBIRD.NET 是你的活动目录的域名,必须大写。
    正确操作的提示:
    [root@filesrv~]# kinit administrator@RAINBIRD.NET                            
    Password for administrator@RAINBIRD.NET: (正确输入密码后直接返回)
    [root@filesrv~]#

    可能遇到的几个常见错误:
    域名错误:
    kinit(v5): Cannot find KDC for requested realm while getting initial credentials.
    密码错误,验证失败:
    kinit(v5): Preauthentication failed while getting initial credentials.
    用户不存在:
    kinit(v5): Client not found in Kerberos database while getting initial credentia                                                                                                                      
    时间不一致:
    kinit(v5): Clock skew too great while getting initial credentials
    4.修改/etc/nsswitch.conf
    passwd: files winbind
    shadow: files winbind
    group: files winbind

    5.配置samba
    修改/etc/samba/smb.conf如下几行
    workgroup = RAINBIRD
    server string = Filesrv
    password server = AD1.RAINBIRD.NET //域服务器,可以用ip也可以用域名
    realm = RAINBIRD.NET //活动目录服务器域名
    security = ads //采用活动目录认证方式
    idmap uid = 16777216-33554431
    idmap gid = 16777216-33554431
    template shell = /sbin/nologin
    template homedir = /home/%U
    winbind use default domain = true
    winbind offline logon = true
    winbind enum groups = yes
    winbind enum users = yes
    winbind separator = /
     
    红色部分是要修改的,蓝色部分是要新增的。建议直接把已经存在的注释掉,把这里列出来的东西,直接放进去,这样在一块方便查找。
    我们现在把samba服务器加入windows域。
    [root@filesrv1 samba]# net ads join -U administrator@RAINBIRD.NET
    administrator@RAINBIRD.NET's password:
    Using short domain name -- RAINBIRD
    Joined 'FILESRV1' to realm 'RAINBIRD.NET'
    提示是”Joined”哟~
     
    加入失败可能的原因:
          两台机器的时间不一致!
    重新启动服务
    service smb restart
    service winbind restart
    设定服务开机自动启动
    chkconfig smb on
    chkconfig winbind on
    咱们去Windows 2003 服务器上检查一下:打开活动目录用户和计算机,查看其中的条目,如果成功的话,就可以看到你的 Linux 服务器。
    650) this.width=650;">
    这里样你可以用wbinfo做一些测试
    验证Samba主机已成功加入AD
    [root@filesrv samba]# wbinfo -t
    checking the trust secret via RPC calls succeeded
    说明主机信任已成功建立
    使用wbinfo –u 可以列出AD中注册的帐号信息
    [root@filesrv samba]# wbinfo -u
    administrator
    guest
    support_388945a0
    krbtgt
    rainbird
    rainbow
    a
    a1
    a2
    root
    a3
    a4
    a5
    a6
    a7
    a8
    a9
    a10
    Wbinfo –g可以返回AD中的组信息
    [root@filesrv samba]# wbinfo -g
    domain computers
    domain controllers
    schema admins
    enterprise admins
    domain admins
    domain users
    domain guests
    group policy creator owners
    dnsupdateproxy
     
    可能的错误
    如果你wbinfo –t 测试的时候提示如下:
    [root@filesrv samba]# wbinfo -t
    checking the trust secret via RPC calls failed
    error code was  (0x0)
    Could not check secret
    说明你winbind服务没起动,重启一下就OK了
    当然了有必要说一下,winbind如果提示启动成功但没有启动的话,有可能是因为你没有加入到域,所以严格按本文的操作步骤来做,你不会错过J
     
    6.自动创建用户目录
    细心的朋友可能发现从开篇一直到现在除了操作方式不一定以外,所做的事情和<<linux加入windows域之完美方案>>没有太大的区别。嗯,笔者不置可否,估且这么理解吧。希望有点小细节您注意到了,在smb.conf中,有一句template shell = /sbin/nologin。是的,samba服务器,我们只希望他提供samba服务,不希望有用户登陆。在上一篇文章中解决用户登陆时主目录不存在的问题,用的是pam_mkhomedir.so这个东东。在文件共享这块,笔者意外的发现,这个文件,对于通过samba访问过来的请求不会创建主目录!这可如何是好?这就是脚本mkhome.sh存在的原因。
    #!/bin/bash
    user=$1
    group=$2
    home=/home/$1
     
    if [ ! -d $home ] ; then
    mkdir -p $home
    chown $user $home
    chgrp $group $home
    chmod 700 $home
    edquota -p administrator -u $user
    fi
          这个脚本接受两个参数,一个是用户名,一个是组名。然后给这个用户创建目录,并分配权限,然后再给分配一下用户空间。Ok,回头看一下smb.conf文件。
    [homes]
            comment = Home Directories
            path = /home/%U //共享的目录
            valid users = rainbird.net/%U //认证的用户,前面必须加rainbird.net哟
            read only = No
            browseable = No
    root preexec = /root/mkhome.sh %U %G //执行创建目录的操作。
          这段配置中最帅的就是这个mkhome.sh的存在。因为这个脚本的执行者是root,所以我们脚本的权限设置700即可。再往下我们将继续探索它的神奇魔力。写完这段保存一下,重启smb:service smb restart。这样,在一台xp的机器上,用域用户登陆,然后访问\\192.168.1.246,是不是看到了一个以你登陆的域用户名命名的一个文件夹呢?没错,就是它!你现在可以试下删写文件了。怎么有问题?有问题就自己检查一下,为什么吧J
    650) this.width=650;">
    7.设置磁盘配额
          因为磁盘配额只能在一块单独的分区上启用,所以笔者专门添加了一块分区挂载到home目录下,这点要注意。
    编辑fstab
    [root@filesrv1 ~]#vi /etc/fstab
    /dev/hdb1               /home               ext3    defaults,usrquota,grpquota
         选择分区,将defaults选项改为:“defaults,usrquota,grpquota”(针对用户和组做磁盘配额)或“defaults,usrquota"(针对用户做磁盘配额 )或"defaults,grpquota"(针对组做磁盘配额)
    重新挂载文件系统:
    [root@filesrv1 ~]#mount –o remount  /home
    创建配额文件
    [root@filesrv1 ~]#quotacheck –cmug  /home
    启动配额
    [root@filesrv1 ~]#quotaon -av
    配额设置
    [root@filesrv1 ~]# edquota -u administrator
    Disk quotas for user administrator (uid 16777216):
         Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
          /dev/sdb1    0   500000   512000              10       0       0    
    (其中:blocks,已用磁盘空间;soft,磁盘空间软限制,hard:磁盘空间硬限制;
            inodes: 已写多少个文件;soft:磁盘文件数量软限制;hard:磁盘文件数量硬限制)
    查看磁盘配额情况
    [root@filesrv1 home]#quota -u administrator
     
    分析:使用磁盘限额有一点不爽的地方就是它不是默认给所有的用户设置限额。也就是说,如果你想给哪个用户启用磁盘限额,你必须先建立那个用户,然后再针对那个用户进行限制。可是在域里,我们所有的用户已经建立好了?怎么一个一个的给进行磁盘限额呢?还好edquota提供了这么一个特性,就是你可以以一个用户为模板,把配置复制给新用户,这样就简单了,如果要手动给用户分配限额的话,这样就可以搞定:wbinfo –u|xargs|edquota -p administrator –u。这样我们就把administrator这个用户的配额情况”分发”给了所有用户!还记得我们的mkhome.sh吗?是的,就是它,里面有这第一句edquota -p administrator -u $user,这句话的意思就是以administrator为模板给用户设置磁盘限额。这样写在脚本里,不但省去了手工执行,新添加用户也不怕了J
    8.域用户登陆自动挂载自己的共享文件夹
           嘿嘿,能做到这步,已经很不容易了,如果你做到了,那么恭喜你,因为终点就在眼前了。到这一步,你已经成功完成了samba通过ad域进行验证,并给验证用户分配500M的固定空间,现在就让我们一鼓作气,将这个优雅的高难度动作画个完美的句号吧J
           我们知道windows有个“映射网络驱动器”的功能。今天用到的东东就是它。其实原理很简单,就是我们写个批处理,这个批处理的功能是获得登陆用户的用户名,然后去连接共享。而用户登陆的时候就自动执行这个批处理。是不是很好玩呢?
           这个操作在域服务器上进行。在服务器上有个路径C:\WINDOWS\SYSVOL\sysvol\rainbird.net\scripts,把你想要域用户登陆执行的脚本放在这个文件里就可以了。
    650) this.width=650;">
    Share.cmd里面的内容是:
    @echo off
    if exist P: net use P: /del /y
           这个文件的权限要设置成everyone读取。不然后域用户登陆的时候会报错的哟。这样还不算完。再配置一下。打开“active directory 用户和计算机”找到users,多选你要分配空间的用户,如图,选择属性。
    650) this.width=650;">
    找到“配置文件”选中“登陆脚本”,在后面的框里输入“share.cmd”
    650) this.width=650;">
    这样,被选中的用户下次再登陆的时候就被“强制”执行这样脚本。当然这个策略不知道要多长时间才能分发下去。如果你现在就想让它生效,那么:gpupdate /force!
    域用户登陆以后在我的电脑就会看到这块共享盘
    650) this.width=650;">
    就是FileSrv那个了。双击打开,就像操作本地硬盘一样方便。
    650) this.width=650;">
    可以添加修改文件。至于空间是不是限定了500M,那就自己试一下吧J(或者去linux quota查询也可以哟~~)
           Samba的故事到这里就讲完了。再下一步就是samba群集了。Move on ,Let’s go!
      
      
  • 相关阅读:
    TopCoder SRM502 Div1 500 贪心 01背包
    TopCoder SRM502 Div1 1000 动态规划
    LOJ#6433. 「PKUSC2018」最大前缀和 状压dp
    Codeforces 830D Singer House 动态规划
    Codeforces 830C Bamboo Partition 其他
    UOJ#275. 【清华集训2016】组合数问题 数位dp
    Codeforces 806 D. Perishable Roads Dijkstra
    UOJ#53. 【UR #4】追击圣诞老人 树链剖分 k短路
    Java第二天——标识符命名规则、Java的知识、快捷键的使用、Scanner获取值的常用方法
    Scanner的例子
  • 原文地址:https://www.cnblogs.com/studio313/p/2009953.html
Copyright © 2011-2022 走看看