Elton's Blog

Tag: ssh

小组级git服务器搭建

by on 十一.26, 2009, under Linux

如果使用git的人数较少,可以使用下面的步骤快速部署一个git服务器环境。

1. 生成 SSH 公钥

每个需要使用git服务器的工程师,自己需要生成一个ssh公钥
进入自己的~/.ssh目录,看有没有用 文件名 和 文件名.pub 来命名的一对文件,这个 文件名 通常是 id_dsa 或者 id_rsa。 .pub 文件是公钥,另一个文件是密钥。假如没有这些文件(或者干脆连 .ssh 目录都没有),你可以用 ssh-keygen 的程序来建立它们,该程序在 Linux/Mac 系统由 SSH 包提供, 在 Windows 上则包含在 MSysGit 包里:

1
2
3
4
5
6
7
8
9
$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/schacon/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/schacon/.ssh/id_rsa.
Your public key has been saved in /Users/schacon/.ssh/id_rsa.pub.
The key fingerprint is:
43:c5:5b:5f:b1:f1:50:43:ad:20:a6:92:6a:1f:9a:3a schacon@agadorlaptop.local

它先要求你确认保存公钥的位置(.ssh/id_rsa),然后它会让你重复一个密码两次,如果不想在使用公钥的时候输入密码,可以留空。

现在,所有做过这一步的用户都得把它们的公钥给你或者 Git 服务器的管理者(假设 SSH 服务被设定为使用公钥机制)。他们只需要复制 .pub 文件的内容然后 e-email 之。公钥的样子大致如下:

1
2
3
4
5
6
7
$ cat ~/.ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSU
GPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3
Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XA
t3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/En
mZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx
NrRFi9wrf+M7Q== schacon@agadorlaptop.local

2. 架设服务器

首先,创建一个 ‘git’ 用户并为其创建一个 .ssh 目录,在用户主目录下:

1
2
3
4
$ sudo adduser git
$ su git
$ cd
$ mkdir .ssh

接下来,把开发者的 SSH 公钥添加到这个用户的 authorized_keys 文件中。假设你通过 e-mail 收到了几个公钥并存到了临时文件里。只要把它们加入 authorized_keys 文件

1
2
3
$ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.josie.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.jessica.pub >> ~/.ssh/authorized_keys

现在可以使用 –bare 选项运行 git init 来设定一个空仓库,这会初始化一个不包含工作目录的仓库。

1
2
3
4
$ cd /opt/git
$ mkdir project.git
$ cd project.git
$ git --bare init

这时,开发人员就可以把它加为远程仓库,推送一个分支,从而把第一个版本的工程上传到仓库里了。值得注意的是,每次添加一个新项目都需要通过 shell 登入主机并创建一个纯仓库。我们不妨以 gitserver 作为 git 用户和仓库所在的主机名。如果你在网络内部运行该主机,并且在 DNS 中设定 gitserver 指向该主机,那么以下这些命令都是可用的:

1
2
3
4
5
6
7
# 在一个工程师的电脑上
$ cd myproject
$ git init
$ git add .
$ git commit -m 'initial commit'
$ git remote add origin git@gitserver:/opt/git/project.git
$ git push origin master

这样,其他人的克隆和推送也一样变得很简单:

1
2
3
4
$ git clone git@gitserver:/opt/git/project.git
$ vim README
$ git commit -am 'fix for the README file'
$ git push origin master

用这个方法可以很快捷的为少数几个开发者架设一个可读写的 Git 服务。

作为一个额外的防范措施,你可以用 Git 自带的 git-shell 简单工具来把 git 用户的活动限制在仅与 Git 相关。把它设为 git 用户登入的 shell,那么该用户就不能拥有主机正常的 shell 访问权。为了实现这一点,需要指明用户的登入shell 是 git-shell ,而不是 bash 或者 csh。你可能得编辑 /etc/passwd 文件

1
$ sudo vim /etc/passwd

在文件末尾,你应该能找到类似这样的行:

1
git:x:1000:1000::/home/git:/bin/sh

把 bin/sh 改为 /usr/bin/git-shell (或者用 which git-shell 查看它的位置)。该行修改后的样子如下:

1
git:x:1000:1000::/home/git:/usr/bin/git-shell

现在 git 用户只能用 SSH 连接来推送和获取 Git 仓库,而不能直接使用主机 shell。尝试登录的话,你会看到下面这样的拒绝信息:

1
2
3
$ ssh git@gitserver
fatal: What do you think I am? A shell? (你以为我是个啥?shell吗?)
Connection to gitserver closed. (gitserver 连接已断开。)
4 Comments :, more...

使用fail2ban增强Linux安全防护

by on 七.26, 2009, under Linux

观察/var/log/messages你可能会经常发现有类似以下的访问记录

1
2
3
4
5
6
Jul 26 04:16:22 prosight sshd[29679]: Invalid user benjamin from 123.140.230.12
Jul 26 04:16:23 prosight sshd[29681]: Invalid user daniel from 123.140.230.12
Jul 26 04:16:24 prosight sshd[29683]: Invalid user william from 123.140.230.12
Jul 26 04:16:24 prosight sshd[29685]: Invalid user anthony from 123.140.230.12
Jul 26 04:16:25 prosight sshd[29687]: Invalid user cameron from 123.140.230.12
Jul 26 04:16:25 prosight sshd[29689]: Invalid user james from 123.140.230.12

同一个用户在不断的尝试用各种用户来登录你的机器。 fail2ban可以很有效的阻止这种频繁的试图登录你的机器的尝试

安装fail2ban

对于gentoo来说很简单,只要emerge一下就可以了。 其他版本的Linux可以通过源码或者rpm包安装

1
$ sudo emerge -av fail2ban

设置fail2ban

/etc/fail2ban/fail2ban.conf 是fail2ban的全局基本配置,基本不用动

1
2
3
4
5
$ cat /etc/fail2ban/fail2ban.conf
 
loglevel = 3
logtarget = /var/log/fail2ban.log
socket = /tmp/fail2ban.sock

/etc/fail2ban/jail.conf 是fail2ban的规则配置文件,我们需要根据情况来编辑它

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[DEFAULT]
ignoreip = 127.0.0.1 #可以忽略的ip,多个ip用空格隔开
 
#当在findtime时间内(秒)失败超过maxretry次数后,就被封bantime时间(秒)
bantime  = 3600
findtime  = 600
maxretry = 3   
 
backend = auto
#如果你使用的是iptables就将这个规则设置为true
[ssh-iptables]
 
enabled  = true
filter   = sshd
action   = iptables[name=SSH, port=ssh, protocol=tcp]
           mail-whois[name=SSH, dest=yourmail@mail.com]
logpath  = /var/log/sshd.log #你ssh日志存放的地址

启动fail2ban

1
$ sudo /etc/init.d/fail2ban start

查看fail2ban状态

启动之后,只要符合filter所定义的正则式规则的日志项出现,就会执行相应的action。由于0.8源码树采用客户机/服务器的模式,因此可以很方便的查询fail2ban的执行情况。比方所,要查询刚才定义的“ssh-iptables”段的情况,只要执行

1
fail2ban-client status ssh-iptables

输出结果:

1
2
3
4
5
6
7
8
Status for the jail: ssh-iptables
|- filter
|  |- Currently failed: 0
|  `- Total failed:     5
`- action
   |- Currently banned: 1
   |  `- IP list:       192.168.210.21
   `- Total banned:     1

fail2ban-client也可以直接定义运行中的fail2ban参数
比如增加屏蔽时间为一天

1
fail2ban-client set ssh-iptables bantime 86400

重新读入配置文件

1
fail2ban-client reload

其它还有很多用法,可以不带参数执行fail2ban-client查看更多选项。

因为fail2ban的框架,所以可以执行修改filter或者action来满足自己的特殊需要,比如我希望改变fail2ban默认的 iptables规则插入方式,那么我就可以到action.d目录下,找到希望修改的action,这里的例子是iptables.conf

默认actionstart的iptables规则有一条是

1
iptables -I INPUT -p <protocol> --dport <port> -j fail2ban-<name>

这样就把fail2ban的规则插到INPUT链的最前面,而我希望自己写的一条iptables -A INPUT -p ALL -s 1.2.3.4/32 -j ACCEPT一直作为第一条规则从而使自己的IP作为信任IP不受防火墙后面规则的限制。那么就要修改fail2ban的启动规则,把上面那条改为

1
iptables -I INPUT 2 -p <protocol> --dport <port> -j fail2ban-<name>

这样fail2ban就会把自己的规则作为INPUT链的第二条规则插入,而不影响第一条。

这里只是一个很简单的例子,你可以根据自己的规则,对action做更多的修改。

而在filter.d目录里就是一些日志的正则式匹配规则,系统自带了一些常见软件的匹配,如 sshd,apache,postfix,vsftpd,pure-ftpd等等。来看看sshd的规则,就能了解这些filter应该怎么写,你就可以用fail2ban来保护更多自己的服务。

sshd.conf的内容

1
2
3
4
5
6
7
8
[Definition]
 
failregex = Authentication failure for .* from <HOST>
            Failed [-/w]+ for .* from <HOST>
            ROOT LOGIN REFUSED .* FROM <HOST>
            [iI](?:llegal|nvalid) user .* from <HOST>
 
ignoreregex =

可以看到,每行一则正则式,对应各种错误认证,如果你的sshd版本错误认证日志项不太一样,可以修改这里的,或者加入更多。

3 Comments :, , more...

SSH的快捷方式

by on 六.16, 2009, under Linux

平常我们在使用ssh的时候,经常需要以

1
ssh [user]@[remote.server.com]

这样的形式来登录远程主机,每次输入用户名和主机的ip地址很麻烦。 后来发现可以在~/.ssh/config中进行配置

1
2
3
Host [the alias]
HostName [domain name or IP address]
User [the account to login as]

这样以后就可以使用alias这个昵称来登录。例如原来你使用ssh root@172.1.1.200来登录,你起了一个test的昵称,之后你就可以使用

1
ssh test

来登录了。 甚至scp都可以,如:

1
scp sometext.txt test

是不是较原来方便了很多。

Leave a Comment :, more...

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!

Visit my friends!

A few highly recommended friends...