Samba
Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件,而SMB是Server Message Block的缩写,即为服务器消息块 ,SMB主要是作为Microsoft的网络通讯协议,后来Samba将SMB通信协议应用到了Linux系统上,就形成了现在的Samba软件。后来微软又把 SMB 改名为 CIFS(Common Internet File System),即公共 Internet 文件系统,并且加入了许多新的功能,这样一来,使得Samba具有了更强大的功能。
samba服务的进化
- smb协议:server message block 服务消息块
- cifs协议 :common internet file system 通用互联网文件系统
Samba最大的功能就是可以用于 Linux 与 windows 系统直接的文件共享和打印共享,Samba既可以用于windows与Linux之间的文件共享,也可以用于Linux与Linux之间的资源共享,由于NFS(网络文件系统)可以很好的完成Linux与Linux之间的数据共享,因而 Samba较多的用在了Linux与windows之间的数据共享上面。
SMB是基于客户机/服务器型的协议,因而一台Samba服务器既可以充当文件共享服务器,也可以充当一个Samba的客户端。例如,一台在Linux 下已经架设好的Samba服务器,windows客户端就可以通过SMB协议共享Samba服务器上的资源文件,同时,Samba服务器也可以访问网络中其它windows系统或者Linux系统共享出来的文件。Samba在windows下使用的是NetBIOS协议,如果你要使用Linux下共享出来的文件,请确认你的windows系统下是否安装了NetBIOS协议。
组成Samba运行的有两个服务,一个是SMB,另一个是NMB;SMB是Samba 的核心启动服务,主要负责建立 Linux Samba服务器与Samba客户机之间的对话, 验证用户身份并提供对文件和打印系统的访问,只有SMB服务启动,才能实现文件的共享,监听TCP 139端口;而NMB服务是负责解析用的,类似与DNS实现的功能,NMB可以把Linux系统共享的工作组名称与其IP对应起来,如果NMB服务没有启动,就只能通过IP来访问共享文件,NMB监听UDP的137和138 端口
例如:某台Samba服务器的IP地址为192.1.68.10.10,对应的工作组名称为 xie,那么在Windows的IE浏览器输入下面两条指令都可以访问共享文件。其实这就是Windows下查看Linux Samba服务器共享文件的方法:
\\192.168.10.10\共享名
\\xie\共享名
smaba服务主要有两个程序
- smb:提供对服务器中文件的共享访问,监听TCP139端口
- nmb:提供基于netbios主机名称的解析,监听UDP 137、138端口
程序目录: /usr/lib/systemd/system/smb.service (Rhel7) 或 /etc/init.d/smb (Rhl6)
配置文件: /etc/samba/smb.conf
用户访问samba server一共有四种验证方式 :
- share:用户访问Samba Server不需要提供用户名和口令, 安全性能较低。
- user:共享目录只能被授权的用户访问,由Samba Server负责检查账号和密码的正确性。账号和密码要在本Samba Server中建立。
- server:依靠其他Windows NT/2000或Samba Server来验证用户的账号和密码,是一种代理验证。此种安全模式下,系统管理员可以把所有的Windows用户和口令集中到一个NT系统上,使用Windows NT进行Samba认证, 远程服务器可以自动认证全部用户和口令,如果认证失败,Samba将使用用户级安全模式作为替代的方式。
- domain:域安全级别,使用主域控制器(PDC)来完成认证
Samba的配置
服务器端
1:关闭 SElinux 和配置防火墙
setenforce 0
firewall-cmd –add-port=139/tcp ; firewall-cmd –add-port=137-138/udp
2:安装samba程序: yum -y install samba
3:修改配置文件 : /etc/samba/smb.conf
-----------------------------global settings-----------------------------------------
[global] //该设置都是与Samba服务整体运行环境有关的选项,它的设置项目是针对所有共享资源的
workgroup = MYGROUP //设定 Samba Server 所要加入的工作组或者域。
server string = Samba Server Version %v //设定 Samba Server 的注释,可以是任何字符串,也可以不填。宏%v表示显示Samba的版本号。
log file = /var/log/samba/log.%m //设置Samba Server日志文件的存储位置以及日志文件名称。在文件名后加个宏%m(主机名),表示对每台访问Samba Server的机器都单独记录一个日志文件。如果pc1、pc2访问过Samba Server,就会在/var/log/samba目录下留下log.pc1和log.pc2两个日志文件
max log size = 50 //最大日志大小为50kb
security = user //用户访问samba的验证方式,一共有四种,当为 share 时,则是允许匿名访问
passdb backend = tdbsam //passdb backend就是用户后台的意思。目前有三种后台:smbpasswd、tdbsam和ldapsam;sam是security account manager(安全账户管理)的简写
load printers = yes //设置是否在启动Samba时就共享打印机。
cups options = raw
----------------------------Share Definitions----------------------------------------
[homes] //默认的共享,默认共享samba用户创建时创建的home目录,可以删除
comment = Home Directories //comment是对该共享的描述,可以是任意字符串。
browseable = no //browseable用来指定该共享是否可以浏览
writable = yes //writable用来指定该共享路径是否可写
valid users = %S //允许访问该共享的用户
invalid users //禁止访问该共享的用户
valid users = MYDOMAIN\%S
[printers] //默认的共享,共享打印,可以删除
comment = All Printers
path = /var/spool/samba
browseable = no
printable = yes
[samba] //自己创建的共享,共享名
comment=share
path=/etc //共享目录是 /etc
writeable=yes //是否可写入
browseable=yes //网上邻居是否可见
guest ok=yes //是否允许所有人访问
valid users=test //允许访问该共享的用户是test用户
write list=test //只有test用户可以写入
查看我们的配置: grep -v “#” /etc/samba/smb.conf | grep -v “;” | egrep “=|]” 使用 testparm 命令可以测试smb.conf配置是否正确
4:创建samba用户:
useradd -M -s /sbin/nologin test
smbpasswd -a test 给smaba用户test设置密码
5:然后启动服务: systemctl start smb
客户端
windows端访问: \\192.168.10.10\共享名 如:\\192.168.10.10\samba
windows访问共享,想注销登陆的话,打开cmd输入net use * /delete /y
Linux端访问:
- smbclient -U 用户名 //ip地址/共享名 如: smbclient -U test //192.168.10.10/samba
- smbclient -L 192.168.10.10 然后提示输入密码 (以当前用户身份登录)
- mount -o username=xx //ip地址/共享名 挂载点 将共享文件挂载到本地
如何添加Samba用户
Window系统连上我们的开发机Linux,自然需要在Samba里添加一个新用户。
linux-06bq:/usr/local/services/samba/bin # ./smbpasswd -a sunjing
New SMB password:
Retype new SMB password:
Failed to add entry for user sunjing.
百度给出的结论是”添加的Samba用户首先必须是Linux用户”,一下子豁朗开郎。
二、用户组设置
添加组:
groupadd nngroup
创建一个用户,将用户添加到组里面:
useradd -g nngroup zhangsan
查看用户所属组id:
id zhangsan
修改用户权限密码:
smbpasswd -a zhangsan
修改系统用户密码:
pdbedit -u -a zhangsan
删除用户:
pdbedit -x -a zhangsan
linux-06bq:/etc/samba # useradd sunjing
linux-06bq:/usr/local/services/samba/bin # ./smbpasswd -a sunjing
New SMB password:
Retype new SMB password:
Added user sunjing.
接下来在Windows机器上【控制面板】→【凭证管理器】中添加Windows凭证:
网络地址:xxx.xxx.xxx.xxx(即需要连接的Linux开发机的IP)
用户名:sunjing
密码:给Samba添加sunjing用户时设置的密码
最后,在【资源管理器】里直接【映射网络驱动器】,连上开发机即可。
smbpasswd命令的常用方法
smbpasswd -a 增加用户(要增加的用户必须以是系统用户)
smbpasswd -d 冻结用户,就是这个用户不能在登录了
smbpasswd -e 恢复用户,解冻用户,让冻结的用户可以在使用
smbpasswd -n 把用户的密码设置成空.
要在global中写入 null passwords -true
smbpasswd -x 删除用户
samba的权限配置
在这篇文章里对于samba共享的目录为所有用户开放了全部的权限,现在由于公司需求改变要进行修改。
需求1:有一个共享目录为rule,里面放公司的规章制度,所有用户都可以查看,但是不能修改
解决方法:在smb.conf里配置read only = yes,具体示例如下:
[rule]
path = /var/samba/rule
read only = yes
public = no
vaild users = theworld
需求2:一部分人只对file1这个目录有权限,一部分人只对file2这个目录有权限
解决方法:
1、首先建立两个samba用户user1和user2,这两个用户要保证是在linux系统中存在的用户,命令如下:
#smbpasswd -a user1
2、然后对目录file1和file2设置访问权限,让用户user1访问file1,用户user2访问file2,命令如下:
#chown user1:user1 /var/samba/file1
#chmod 700 /var/samba/file1
3、在smb.conf中配置file1和file2的访问权限,示例如下:
[file1]
path = /var/samba/file1
read only = no
public = no
vaild users = user1
4、在客户端登录samba服务的时候分配给访问file1的用户user1的用户名,访问file2的用户user2的用户名。
需求3:只有user1组里的人对file1这个目录有权限,
并且user1组中用户a有读写权限,而用户b只有读权限
解决方法:
1、首先建立两个samba用户a和b,这两个用户要保证是在linux系统中存在的用户,并且在同一个用户组user1中,创建方法同上
2、然后对目录file1设置访问权限,让用户组user1可以访问file1,命令如下:
#chown user1.user1 /var/samba/file1
#chmod 770 /var/samba/file1
3、在smb.conf中配置file1的访问权限,示例如下:
[file1]
path = /var/samba/file1
public = no
vaild users = @user1
write list = a
read list = b
需求4:只有user1组里的人对file1这个目录有权限,并且user1组中所有用户都有读写权限,
这里值得注意的是当权限设置好后新建文件夹及文件的权限会与之前不同导致同组用户只有
读权限没有写权限,所以要在配置文件中指定新建文件及文件夹的权限
解决方法:
1、首先建立所需的samba用户若干,这些用户要保证是在linux系统中存在的用户,并且在同一个用户组user1中,创建方法同上
2、然后对目录file1设置访问权限,让用户组user1可以访问file1,命令如下:
#chown user1.user1 /var/samba/file1
#chmod 770 /var/samba/file1
3、在smb.conf中配置file1的访问权限,示例如下:
[file1]
path = /var/samba/file1
read only = no
public = no
create mode = 0770
directory mode = 0770
vaild users = @user1
write list = @theworld
useradd 示例 – 增加一个新用户到附加用户组¶
新增加一个用户并将其列入一个已有的用户组中需要用到 useradd
命令。如果还没有这个用户组,可以先创建该用户组。
命令参数如下:
useradd -G {group-name} username
例如,我们要创建一个新用户 cnzhx 并将其添加到用户组 developers 中。首先需要以 root 用户身份登录到系统中。先确认一下是否存在 developers 这个用户组,在命令行输入:
# grep developers /etc/group
输出类似于:
developers:x:1124:
如果看不到任何输出,那么就需要先创建这个用户组了,使用 groupadd
命令:
# groupadd developers
然后创建用户 cnzhx 并将其加入到 developers 用户组:
# useradd -G developers cnzhx
为用户 cnzhx 设置密码:
# passwd cnzhx
为确保已经将该用户正确的添加到 developers 用户组中,可以查看该用户的属性,使用 id
命令:
# id cnzhx
输出类似于:
uid=1122(cnzhx) gid=1125(cnzhx) groups=1125(cnzhx),1124(developers)
前面命令中用到的大写的 G (-G) 参数就是为了将用户添加到一个附加用户组中,而同时还会为此用户创建一个属于他自己的新组 cnzhx。如果要将该用户同时增加到多个附加用户组中,可以使用英文半角的逗号来分隔多个附加组名(不要加空格)。例如,同时将 cnzhx 增加到 admins, ftp, www, 和 developers 用户组中,可以输入以下命令:
# useradd -G admins,ftp,www,developers cnzhx
useradd 示例 – 增加一个新用户到主要用户组¶
要增加用户 cnzhx 到组 developers,可以使用下面的指令:
# useradd -g developers cnzhx
# id cnzhx
输出类似于:
uid=1123(cnzhx) gid=1124(developers) groups=1124(developers)
请注意如前面的示例的区别,这里使用了小写字母 g (-g)作为参数,此时用户的主要用户组不再是 cnzhx 而直接就是 developers。
小写字母 g (-g)将新增加的用户初始化为指定为登录组(主要用户组)。此组名必须已经存在。组号(gid)即是此已有组的组号。
usermod 示例 – 将一个已有用户增加到一个已有用户组中¶
将一个已有用户 cnzhx 增加到一个已有用户组 apache 中,使此用户组成为该用户的附加用户组,可以使用带 -a 参数的 usermod
指令。-a 代表 append, 也就是将用户添加到新用户组中而不必离开原有的其他用户组。不过需要与 -G 选项配合使用:
# usermod -a -G apache cnzhx
如果要同时将 cnzhx 的主要用户组改为 apache,则直接使用 -g 选项:
# usermod -g apache cnzhx
如果要将一个用户从某个组中删除,则
gpasswd -d user group
但是这个时候需要保证 group 不是 user 的主组。
附:管理用户(user)和用户组(group)的相关工具或命令¶
1)管理用户(user)的工具或命令
useradd 注:添加用户
adduser 注:添加用户
passwd 注:为用户设置密码
usermod 注:修改用户命令,可以通过usermod 来修改登录名、用户的家目录等等;
pwcov 注:同步用户从/etc/passwd 到/etc/shadow
pwck 注:pwck是校验用户配置文件/etc/passwd 和/etc/shadow 文件内容是否合法或完整;
pwunconv 注:是pwcov 的立逆向操作,是从/etc/shadow和 /etc/passwd 创建/etc/passwd ,然后会删除 /etc/shadow 文件;
finger 注:查看用户信息工具
id 注:查看用户的UID、GID及所归属的用户组
chfn 注:更改用户信息工具
su 注:用户切换工具
sudo 注:sudo 是通过另一个用户来执行命令(execute a command as another user),su 是用来切换用户,然后通过切换到的用户来完成相应的任务,但sudo 能后面直接执行命令,比如sudo 不需要root 密码就可以执行root 赋与的执行只有root才能执行相应的命令;但得通过visudo 来编辑/etc/sudoers来实现;
visudo 注:visodo 是编辑 /etc/sudoers 的命令;也可以不用这个命令,直接用vi 来编辑 /etc/sudoers 的效果是一样的;
sudoedit 注:和sudo 功能差不多;
2)管理用户组(group)的工具或命令
groupadd 注:添加用户组;
groupdel 注:删除用户组;
groupmod 注:修改用户组信息
groups 注:显示用户所属的用户组
grpck
grpconv 注:通过/etc/group和/etc/gshadow 的文件内容来同步或创建/etc/gshadow ,如果/etc/gshadow 不存在则创建;
grpunconv 注:通过/etc/group 和/etc/gshadow 文件内容来同步或创建/etc/group ,然后删除gshadow文件;
评论前必须登录!
立即登录 注册