2014年4月28日星期一

OpenSSH sshd进程

sshd服务是OpenSSH的守护进程。
sshd就是ssh daemon。
此服务附带的工具程序可以取代rlogin和rsh,在两台会话的主机间通过非安全的Internet建立起安全的加密连接。sshd监听来自客户端的连接请求,并在接收到请求时fork一个子进程;此子进程将负责处理密钥交换、加密、认证、命令执行及数据传输等。可以使用命令行选项或者配置文件来配置启动sshd,但命令行中指定的选项将优先于配置文件中的相同选项。

-4 强制sshd仅接收来自IPv4格式地址的请求;

-6 强制sshd仅接收来自IPv6格式地址的请求;

-b 指定ssh v1中服务器密钥的长度位数;

-D 此选项只是用来监视sshd的启动状态,在附加此选项时,sshd不会作为一个守护进程启动;

-d 此选项将启动调试模式;sshd服务的启动状态会在前台显示,并把详细的调试信息输出至日志文件;此时, sshd不会fork新的子进程,因此仅仅能接受一个连接请求。此先项主要用来调试sshd;

-e 输出错误信息到日志文件,不包括正常的调试信息;

-f 此选项后接指定的配置文件;默认为/etc/ssh/sshd_config;

-g 此选项后跟一个时间期限,默认单位是秒,用来为客户端认证期间提供一个可以等待的期限;如果客户端在此指定期限内认证错误,sshd将断开连接并退出;0表示无时间限制;

-h 此选项后跟一个主机密钥文件,用来指定一个sshd启动时读取的主机密钥文件;在以非root身份启动sshd时必须指定此选项(因为默认的key文件只有root具有读权限);ssh v1默认的key文件为/etc/ssh/ssh_host_key,sshd v2默认的key为/etc/ssh/ssh_host_rsa_key以及/etc/ssh/ssh_host_dsa_key;可以为不同版本的协议及不同的密钥算法指定不同的key文件;

-i 此选项用来指定通过inetd守护进程启动sshd;sshd需要生成服务端密钥才能接受客户端的请求,这将需要大约10秒钟的时间,如果每个请求都重新生成一次密钥的话,客户端将不得不等待较长的时间,因此,默认情况下是不使用inet方式启动sshd的;如果使用较短长度的密钥,此选项将是一个颇富弹性的选择;

-k 此选项后跟一个时间期限,用来为ssh v1指定一个重新生成服务端key的时间间隔(默认为一个小时);如此频繁的生成密钥的目的在于不必存储密钥,因此,超过了一个小时后恢复通讯期间加密的数据几乎是不可能的,哪怕机器被攻入亦或被占据,这将在很大程度上提高了安全性;0表示不重新生成密钥;

-o 用来为配置文件指定一个新的可用选项;

-p 指定sshd服务监听的端口(默认是22),可以同时指定多个端口;如果使用此选项,则会忽略配置文件中指定的端口;
-q 安静模式,此种情况下将不会产生任何系统日志;正常情况下,服务启动、认证以及每一次终端登录都会被记录;

-t 测试模式,仅用来检查配置文件的正确性及密钥是否健壮;此选项多用在配置文件改动时;

六、sshd相关的文件详细说明

~/.hushlogin
如果配置文件中分别启用了PrintLastLog和PrintMotd选项,则此文件可以用来在屏幕显示前一次的登录时间以及/etc/motd的内容。但不会显示Banner选项指定的banner。

~/.rhosts
此文件主要用来实现主机间的认证。如果你的主机上有些用户的主目录位于NFS文件系统上,则必需把这个文件的权限置为全局可读,因为sshd进程将以root的身份读取此文件。此外,此文件属主必须为相关用户,且其他任何用户均不能具有写权限。一般推荐的权限为600。

~/.ssh/authorized_keys
此文件存储的是用户的公钥,当其远程登录时可以用此公钥为其进行认证。公钥信息并非要求高度安全性的文件,但仍推荐将其权限置为700。如果此文件、~/.ssh目录或者此用户的主目录能被其他用户读取,则此文件将可能被其他非授权用户修改或置换。
此种情况下,除非在主配置文件中把StrictModes的值置为"no",否则sshd将不允许使用此文件。

~/.ssh/environment
如果此文件存在,将会在用户登录时读入用户的环境。它只能包含空行、以"#"开头的注释行以及形如“name=value”赋值行,推荐权限为600。默认情况下此功能是禁止的,可以通过PermitUserEnviroment选项开启。

~/.ssh/known_hosts
用户曾成功登入过的主机的host key都将存放于此文件,但不包括系统间已经互相成功认证的主机host key,只能让root和属主具有读写权限。

~/.ssh/rc
此文件用来在用户的主目录不能正常访问前初始化用户的登录环境,其权限应该为600。

/etc/host.equiv
用于主机间的认证,只能让root用户可写。

/etc/nologin
如果这个文件存在,sshd将拒绝除root用户外的任何其他用户登录。在任何用户在尝试登录时,此文件都将被显示,但所有非root用户将被拒绝。此文件应该是全局可读的。

/etc/ssh/ssh_known_hosts
存入系统级别的互相认证时已知主机的host key。这个文件需要管理员手动配置,可以将已知主机的公钥存入于此文件。此文件只能为root或属主读写,但应该是全局可读的。

/etc/ssh/ssh_host_key
/etc/ssh/ssh_host_dsa_key
/etc/ssh/ssh_host_rsa_key
以上三个文件用来存放主机密钥的私钥部分,它们的属主只能为root用户,只能被root用户读取,不能为其他任何用户访问。如果其他用户可以读取此文件,则sshd将不能启动。

/etc/ssh/ssh_host_key.pub
/etc/ssh/ssh_host_dsa_key.pub
/etc/ssh/ssh_host_rsa_key.pub
以上三个文件用来存放主机密钥的公钥部分,它们应该是全局可读的,但只有root用户可写。它们分别对应相应的私钥文件。这些文件并没有什么实际用途,仅仅是用来为用户认证登录提供便利,因此常被copy至其它可信的主机中。可以使用ssh-keygen来生成这些文件。

/etc/ssh/sshd_config
sshd的主配置文件;

2014年4月26日星期六

SSH、OpenSSH 使用和配置

SSH是一种网络协议,用于计算机之间的加密登录。

OpenSSH是SSH协议的免费开源实现。SSH协议族可以用来进行远程控制,或在计算机之间传送文件。而实现此功能的传统方式,如telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh都是极为不安全的,并且会使用明文传送密码。

OpenSSH提供了服务端后台程序和客户端工具,用来加密远程控件和文件传输过程中的数据,并由此来代替原来的类似服务。

  1. ssh分为openssh-client和openssh-server
  2. ssh登录命令:ssh [-p port] [user@]hostname
  3. 如果修改过登录端口,需要添加端口 ssh -p 12345 root@x.x.x.x
  4. 我们需要安装ssh-server用于远程用户的ssh登录,ubuntu可以apt-get install openssh-server,然后查看sshd进程是否启动 ps -e|grep sshd,如果启动则远程用户可以通过ssh登录了。

ssh配置文件 /etc/ssh/sshd_config

  1. 可以修改ssh登录端口,默认端口22,改端口可以防止被端口扫描
  2. 可以禁止root登录,permitRootLogin no
  3. 可以禁止密码登录
  4. LoginGraceTime 20,意思为:通过sshd登陆服务器后,必须在出现操作提示符20秒内登陆,只要超时,sshd会自动切断连接。
  5. PermitRootLogin without-password,意思为:禁止root帐户使用用户名+密码认证方式登陆,只能使用公共密钥方式登陆。
  6. PasswordAuthentication no,意思为:禁止使用用户名+密码认证方式登陆,只能使用公共密钥方式登陆。
  7. LogLevel VERBOSE,意思为:在日志中记录更多的有关登陆成功和登陆失败的信息。

ssh重启

  1. service ssh restart
  2. /etc/init.d/ssh restart

ssh的log文件保存在/var/log/auth.log


ssh允许和拒绝用户和用户组
  1. DenyUsers, AllowUsers, DenyGroups, and AllowGroups
  2. DenyUsers aaa,拒绝aaa用户登录
  3. AllowGroups groupname,groupname为系统用户的组,此keyword设置只能该组的用户登录

ubuntu网络配置

ubuntu网络配置

配置命令 ifconfig

  1. 从ifconfig命令可以得到当前已经激活的网卡。
  2. eth一般代表独立网卡,em一般代表集成网卡
  3. ifconfig -a 可以查看所有的网卡
  4. 如果网卡没有激活,使用 ifconfig eth0 up/down 来开启/关闭
  5. 默认情况,服务器 网卡都是关闭的。
配置文件 /etc/network/interface
  1. IP、网关、掩码配置
  2. 如果网卡没有激活,用ifconfig命令虽然可以激活,但是系统重启后,配置就会还原。这样我们需要修改配置文件,配置网卡自动激活以及IP分配方式等等。
  3. 在配置文件里添加
  • auto eth0     eth0 自启动 
  • iface eth0 inet dhcp      使用dhcp配置动态IP
  • iface eth0 inet static      配置静态IP 
  • 配置静态IP,还需要设置 IP address、netmask、gateway
  • address   192.168.1.100
  • netmask   255.255.255.0
  • gateway   192.168.1.1 
DNS配置文件 /etc/resolv.conf

  1. 添加DNS服务器 nameserver 8.8.8.8 
  2. 如果有多个DNS,即再添加 nameserver
  3. DNS配置文件修改之后,立即生效

重启网络服务

  1. service networking restart
  2. /etc/init.d/networking restart

禁Ping

  1. 配置文件在 /proc/sys/net/ipv4/icmp_echo_ignore_all
  2. 默认该配置文件为0
  3. 如果要禁ping,则修改为1。可用命令echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
  4. 但上面这种方式,在系统重启之后,会还原为0
  5. 如果想一直生效,可以将命令写入系统启动文件 /etc/rc.local 里
  6. 或者 自己写一个 初始化配置文件init.sh,然后在 /etc/rc.local 里 sh init.sh,在系统启动时自动运行该文件就可以了。

2014年4月24日星期四

rc.local

 1. /etc/rc.local
   这是使用者自订开机启动程序,把需要开机自动运行的程序写在这个脚本里
   --------引用----------------------
  在完成 run level 3 的服务启动后,如果我还有其他的动作想要完成时,举例来说, 我还想要寄一封 mail 给某个系统管理帐号,通知他,系统刚刚重新开机完毕,那么,是否应该要制作一个 shell script 放置在 /etc/rc.d/init.d/ 里面,然后再以连结方式连结到 /etc/rc.d/rc3.d/ 里面呢?呵呵!当然不需要!还记得上一小节提到的 /etc/rc.d/rc.local 吧? 这个档案就可以执行您自己想要执行的系统指令了。像不像早期 DOS 年代的 autoexec.bat 与 config.sys 呢? ^_^
  也就是说,我有任何想要在开机时就进行的工作时,直接将他写入 /etc/rc.local , 那么该工作就会在开机的时候自动被载入喔!而不必等我们登入系统去启动呢!是否很方便啊!一般来说,鸟哥就很喜欢把自己制作的 shell script 完整档名写入 /etc/rc.d/rc.local ,如此一来,开机就会将我的 shell script 执行过,真是好棒那!
  --------引用----------------------
也就是说,在linux启动的最后阶段,系统会执行存于rc.local中的命令。和windows里面的“启动”菜单有点像,但是设置麻烦些,功能更强大

使用情况:
1)oracle等服务器的启动:如果你需要你的oracle可以随着系统一起启动,你可以去看看/etc/oratab这个文件,然后去了解它,你就会发现这里才是它正确的位置所在
2)静态路由: 对于需要增加大量的不是本网段的路由时,很多人喜欢在/etc/rc.d/rc.local里添加类似
route add -net 192.168.1.0 netmask 255.255.255.0 gw 10.224.0.251
route add -host 192.168.100.1  gw 10.224.0.251

2. /etc/init.d 
       这个目录存放的是一些脚本,一般是linux以rpm包安装时设定的一些服务的启动脚本。系统在安装时装了好多rpm包,这里面就有很多对应的脚本。执行这些脚本可以用来启动,停止,重启这些服务。举个例子来说,如果你要重新启动 sendmail 的话,而且你的 sendmail 是以 rpm 来安装的,那么下达 /etc/rc.d/init.d/sendmail restart 就可以直接启动 sendmail 啰!
        前面说到,/etc/rc.d/init.d这个目录下的脚本就类似与windows中的注册表,在系统启动的时候执行。程序运行到这里(init进程读取了运行级别), 是该运行init.d里的脚本了,但是并不是直接运行,而是有选择的因为系统并不需要启动所有的服务。
  那么,系统是如何选择哪些需要启动哪些不要呢?这时刚才说的运行级别就起作用了。在决定了系统启动的run level之后,/etc/rc.d/rc这个脚本先执行。在RH9和FC7的源码中它都是一上来就check_runlevel()(虽然实现的代码不一样,也大同小异),知道了运行级别之后,对于每一个运行级别,在rc.d下都有一个子目录分别是rc0.d,rc1.d ….. rc6.d。每个目录下都是到init.d目录的一部分脚本一些链接。每个级别要执行哪些服务就在相对应的目录下,比如级别5要启动的服务就都放在rc5.d下,但是放在这个rc5.d下的都是一些链接文件,链接到init.d中相对应的文件,真正干活到init.d里的脚本。


linux /etc/rc.d/目录的详解
rc.d的内容如下:
init.d/ :各种服务器和程序的二进制文件存放目录。
rcx.d/: 各个启动级别的执行程序连接目录。里头的东西都是指向init.d/的一些软连接。具体的后边叙述。
还有三个脚本:rc.sysinit, rc, rc.local
redhat的启动方式和执行次序是:
加载内核
执行init程序
/etc/rc.d/rc.sysinit # 由init执行的第一个脚本
/etc/rc.d/rc $RUNLEVEL # $RUNLEVEL为缺省的运行模式
/etc/rc.d/rc.local
/sbin/mingetty # 等待用户登录
在Redhat中,/etc/rc.d/rc.sysinit主要做在各个运行模式中相同的初始化工作,包括:
调入keymap以及系统字体
启动swapping
设置主机名
设置NIS域名
检查(fsck)并mount文件系统
打开quota
装载声卡模块
设置系统时钟
等等。

/etc/rc.d/rc则根据其参数指定的运行模式(运行级别,你在inittab文件中可以设置)来执行相应目录下的脚本。凡是以Kxx开头的
,都以stop为参数来调用;凡是以Sxx开头的,都以start为参数来调用。调用的顺序按xx
从小到大来执行。例如,假设缺省的运行模式是3,/etc/rc.d/rc就会按上述方式调用
/etc/rc.d/rc3.d/下的脚本。
值得一提的是,Redhat中的运行模式2、3、5都把/etc/rc.d/rc.local做为初始化脚本中
的最后一个,所以用户可以自己在这个文件中添加一些需要在其他初始化工作之后,登录之前执行的命令。

2014年4月23日星期三

Gitolite

gitolite用于git版本库的权限控制。
gitolite发端自gitosis,功能早已超越后者,而且gitosis已停止跟新好多年!
安装
使用单独的用户git来安装gitolite
创建用户
1
# adduser --shell=/bin/bash git
安装gitolite
先为自己生成一个密钥对
1
$ ssh-keygen -b 2048 -t rsa -f your_name
然后
对于ubuntu可以通过apt-get install gitolite3安装
1
2
3
4
$ git clone git://github.com/sitaramc/gitolite
$ mkdir -p $HOME/bin
$ $HOME/gitolite/install -to $HOME/bin
$ $HOME/bin/gitolite setup -pk your_name.pub
安装就算完成了。
安装之后gitlote会在$HOME/repositories目录下初始化两个git仓库,gitolite-admin.git和testing.git,前者用于管理gitlote,后者是个测试用的仓库。
配置
gitolite通过更新gitolite-admin.git仓库来实施管理。所以要先clone这个仓库:
1
$ git clone ywang@:gitolite-admin
这里ywang@ubuntu是主机名。
用户管理
将git用户的公钥拷贝到进入管理仓库下的子目录keydir,然后提交推送即可。用户的公钥以username.pub的格式命名,username与权限管理时指定的用户名必须是一致的。
权限管理
权限管理就是配置管理仓库子目录conf下的gitolite.conf文件。配置完毕提交推送权限就会生效。
先列出一个简单的配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@admin      =   openwares
@staff      =   minli.wang @admin
repo gitolite-admin
    RW+     =   @admin
repo testing
    RW+     =   @all
repo foobar
    RW+             =   @admin
    -   master      =   @staff
    -   refs/tags   =   @staff
    RW  devel       =   @staff
    RW+             =   @staff
gitolite支持按用户或组管理权限。组名以@开头,可以包含多个用户,名字以空格分隔。组还可以嵌套其他组。
权限规则行的格式为:
1
more refexes> = more users/user groups>
refex的含义见下一节
权限分类和规则
  • C
  • 可以创建新仓库
  • R
  • 可以读取仓库
  • RW
  • 可以读取,fast-forward推送,创建分支和标签
  • RW+
  • 可以进行任何类型的push,包括delete,rewind,overwrite等
  • -
  • 拒绝任何类型的推送
对于clone和fetch操作,只要当前用户具有R,RW或RW+任何一种权限,都可以读取仓库,其实就是存在R权限。
对于push操作,gitolite顺序处理权限规则,直到找到一条用户,权限许可和分支模式完全匹配的规则为止,之后的规则不再处理,所以一定要注意权限规则的顺序问题。
refex
refex这玩意儿就类似于regex的叫法,是指ref的匹配模式。有以下匹配规则:
  • 空的refex处理为’refs/.*’,也就是匹配任何refs,因为ref默认都存在于refs/目录下
  • 如果指定的refex没有以refs/开头,则为其添加前缀refs/heads/
  • refex使用隐式的行首规则,^在规则表达式中为匹配行首,refex默认从行首匹配,但没有$行尾匹配。举个栗子,如果指定refex为master,则下面这几个ref都可以匹配:
    1
    2
    3
    refs/heads/master
    refs/heads/master1
    refs/heads/master/full
  • 最后实际被推送到的ref以经过规则匹配后的结果为准
个人分支
gitolite支持为用户设立个人分支空间,其规则如下:
1
RW+ personal/USER/  =   alice
personal可以为任何字符,/USER/会被替换成实际的用户名,因此用户alice可以在personal/alice/目录推送任何分支,比如
personal/alice/foo和personal/alice/bar,但不能推送到personal/alice。
个人分支空间为每个用户设立一个私人空间,防止公共分支空间的名字污染。开发者可以随意使用自己的个人分支空间,无需关心其权限问题,也不用担心分支名字冲突。
gitolite shell
gitolite提供了一个简单的ssh shell,可以了解远程仓库的一些信息和进行一些管理操作,以下命令可以查看shell的帮助:
1
$ ssh gitolite help
gitolite是远程gitolite的ssh别名。可以在每个支持的命令后面添加-h参数来了解命令的详细用法。比如:
1
$ ssh gitolite help -h
新建gitolite远程仓库
有这么几种方法:
  • 服务器管理员远程登录服务器,直接在$HOME/repositories目录下初始化裸仓库,这和使用git没有任何差别
  • 修改gitolite-admin/conf/gitolite.conf文件,添加新仓库及其权限,提交推送时,gitolite会自动创建新仓库
  • 具有创建仓库权限的用户,可以本地创建空仓库,然后添加远程仓库引用,推送后gitolite会为用户创建新仓库。比如:
    1
    2
    3
    4
    5
    6
    mkdir somegit
    cd somegit
    git init
    git commit --allow-empty
    git remote add origin git@server:Projects/somegit.git
    git push origin master
删除gitolite仓库
先删除配置文件中仓库的相关配置,然后登录服务器删除仓库,gitolite不会自动删除仓库。
References:
[1]github:gitolite
[2]official:gitolite