Untitled Post - 49
Mac OS X系统上有些组和用户的帐号是下划线开头的,一般用于系统服务帐号,这只是一个命名习惯,没有什么特别之处。
Mac OS X系统上有些组和用户的帐号是下划线开头的,一般用于系统服务帐号,这只是一个命名习惯,没有什么特别之处。
下载解压
1 | $ cd ~/Downloads |
创建运行tomcat的非特权用户
使用root用户运行tomcat会有安全性方面的问题,如果tomcat被攻陷则整个系统就会沦陷。因此创建一个非特权用户来运行tomcat
首先选择一个User ID和Group ID,500以上的ID用于正常的用户,因此需要选择一个0-500之间的数字作为GID和UID。
列出当前系统组,用户及其ID
1 | $ dscl . -list /Groups PrimaryGroupID sort -n -k 2 |
这里选择101作为UID和GID,创建组和用户:
1 | # dscl . -create /Groups/_tomcat PrimaryGroupID 101 |
新创建用户的shell设置为/usr/bin/false,使其无法登录,密码设置为*为禁用账户。
设置tomcat目录权限
1 | $ cd /usr/local/tomcat |
launchd脚本
写一个launchd包装脚本来启动tomcat,并且一直等待tomcat进程直到其退出。
/usr/local/tomcat/bin/tomcat-launchd.sh
1 | #!/bin/sh |
plist配置文件:
/usr/local/tomcat/conf/org.apache.tomcat.plist
[xml]
[/xml]
JAVA_HOME变量的值由以下命令确定:
1 | $ /usr/libexec/java_home |
然后将plist文件符号链接到/Library/LaunchDaemons目录:
1 | # cd /Library/LaunchDaemons |
使用launchd管理tomcat
设置完成后,可以使用以下命令加载配置并启动tomcat
1 | # launchctl load /Library/LaunchDaemons/org.apache.tomcat.plist |
修改plist配置文件后重新加载配置:
1 | # launchctl unload /Library/LaunchDaemons/org.apache.tomcat.plist |
plist文件中RunAtLoad设置为true会使tomcat开机自动运行。而如果KeepAlive设置为true,则当tomcat进程退出后,无论是什么原因导致tomcat进程退出,launchd守护进程会重新启动tomcat。因此更改tomcat配置后可以这样重新启动tomcat进程:
1 | # launchctl stop org.apache.tomcat |
或者直接kill tomcat进程亦可。
如果KeepAlive设置为false,则需要手工启动tomcat进程,如下:
1 | # launchctl stop org.apache.tomcat |
servlet api符号链接
1 | # ln -sfv /usr/local/tomcat/lib/servlet-api.jar /usr/share/java/servlet-api.jar |
References:
[1]installing Tomcat On Mac OS X
===
[erq]
传统unix系统中,wheel用户组是管理员组,只有该组的成员才可以通过su获取root权限。当然要对该组做特殊设置才可以做到这些限制。
wheel实际上已经成了管理员组的代名词。
配置wheel用户组
编辑文件
/etc/pam.d/su
1 | #root使用su命令不需要密码 |
staff用户组
staff就是系统全体用户,所有的系统用户都是staff组的成员,因此改变的文件的组权限为staff则所有的用户都具有了相应的权限。
References:
[1]Linux 中的 wheel 组和 staff 组
===
[erq]
客户端认证是由文件pg_hba.conf来配置的,通常pg_hba.conf存放在数据库集群的数据目录中,当然也可以放在其他地方,比如debian就放在了/etc/postgresql/[version]/[cluser]/目录下。
当使用用户名映射时,还需要一个用户名映射配置文件,这个文件的存放位置与pg_hba.conf一样,可以在集群的数据目录中, 也可以放置在其他目录中。
无论客户端以何种方式来登录数据库,都要有一个客户端可以访问的数据库用户或叫角色存在。如果是本地认证,则服务器会验证发起请求的客户端的系统用户名,系统用户名可能与数据库角色相同,也可能不同。
pg_hba.conf配置
配置格式如下:
1 | #request_mode db_name db_role address mask method options |
local认证方法使用unix domain socket进行连接,其他认证方法通过TCP/IP连接,带有ssl后缀的认证方式使用SSL连接,带有nossl后缀的认证方式不使用SSL连接,host则既可以使用SSL连接,也可以不使用。
一个客户端请求只会匹配pg_hba.conf中与连接类型,数据库,数据库用户和地址等信息匹配的第一行,无论登录成功与否都不会再去匹配其他行。
database
指定要访问的数据库。all匹配所有的数据库,sameuser表示如果请求的数据库名与角色名相同则匹配。replication表示允许replication连接请求,此时不指定任何特定的数据库。可以用逗号分隔来指定多个数据库。
user
指定访问数据库使用的数据库角色名,all匹配所有存在的数据库角色。
address
声明这条记录匹配的客户端机器的地址。可以是主机名或者ip地址。ip地址可以以常用的两种方式指定。0.0.0.0/0代表全部IPv4地址,::/0代表全部Ipv6地址。
auth-method
trust
无条件的允许连接。这个方法允许任何人用任意一个PostgreSQL用户登录到PostgreSQL数据库。
peer
从操作系统获取操作系统的用户名,然后检查它是否和请求的数据库角色名相匹配。这只对本地连接有效。可以使用用户名映射,使系统用户名映射到不同的数据库角色。
这种登录方式与oracle的OS认证登录方式类似
md5
要求客户端提供一个MD5加密的口令进行认证。
password
要求客户提供一个未加密的密码进行身份验证。不安全。
krb5
使用Kerberos V5来进行认证用户。这只对TCP/IP连接有效。
ident
使用ident服务器认证用户。
ldap
用LDAP服务器进行认证
radius
用RADIUS服务器进行认证
cert
用SSL客户端证书进行认证
pam
使用PAM认证。
[auth-options]
以name=value的形式为这些认证方法指定一些选项。比较常用的是指定用户名映射,格式为map=map-name,map-name指定pg_ident.conf文件中的一条命名用户名映射记录。
pg_ident.conf配置
用于系统用户名到数据库角色名的映射。格式如下
1 | #map-name system-username database-username |
为某个认证方法指定map=admin选项后,john就可以以postgres数据库角色来访问数据库。peer认证默认要求system-username与database-username必须一致,可以使用用户名映射来改变这一默认行为。
References:
[1]The pg_hba.conf File
[2]User Name Maps
[3]Authentication Methods
===
[erq]
macbook air上没有右CRTL键,vim里面使用CTRL+F翻页简直没法用了。而在mac上vim里重新映射option键(ALT)却无法工作,参数winaltkeys没用的,因为根本就不使用vim的菜单,都是光秃秃的窗口,linux上重新映射ALT键没问题的。只好在mba上全局性的修改键盘映射,System Preferences -> Keyboard -> Modifier Keys
将Control和Option互换,勉强凑合用吧。
mac os x咋这样尼,想让用户登录时执行一个脚本,写到 /.profile里竟然不执行,你默认的shell是bash啊,亲!然后需要各种方法执行一个用户登录脚本,麻烦死了,最后将登录脚本丢到login items里面,也勾选了hide选项,登录时竟然还有一个shell窗口一闪而过。/.bashrc,你这是bash吗???幸好~/.bash_profile还会被执行,完全不如linux好用啊!
还有啊,打开非登录交互式终端竟然也不执行
使用PAC(Proxy auto-config)可以使用户代理根据不同的URL采用不同的代理访问策略。
git的工作流程可以多种多样。
gitolite用于git版本库的权限控制。
内网使用域名或公网IP访问同一个子网对外提供服务的服务器时,如不做特殊设置将无法访问,通过在内网接口上配置与公网接口相同的NAT设置可以解决此问题,实际上是对内网的源IP进行了NAT替换,替换成了防火墙内网接口的地址,从而使返回的数据包可以回流到防火墙再替换成正确的源IP,否则因为访问者和服务器在相同的内部网络中,数据包会走内部路由规则直接返回给访问者,由于数据包来源于内网ip而不是公网ip,会被访问者拒绝。但是ICMP不受此影响,如果用ping程序测试,网络看起来是通畅的。
也就是说,端口回流时,对数据包的源ip和目标ip都做了替换,源ip替换成了防火墙内网接口的ip,而目标ip替换成了内网真正提供服务机器的ip,相应包返回到防火墙内网接口时,根据此前的替换记录,将ip地址再对调回来就ok了。
1 | $ telnet x.x.x.x |
注意:还要在内网接口上做相应的acl规则以允许相应的内网流量从防火墙的内网接口通过。
比如内网接口的acl添加如下规则:
1 | rule 211 permit ip source 192.168.2.0 0.0.0.255 destination 192.168.0.3 0 |
以允许192.168.2.0/24网段的机器可以通过内网接口访问192.168.0.3这台机器。
或者
1 | rule 216 permit ip destination 192.168.0.3 0 |
允许所有的机器可以通过内网接口访问192.168.0.3这台机器。
UPDATE(05/26/2016):
但这样设置会造成一个问题,所有的访问流量无论内外网都会被替换源地址,这可能不是你想要的。
参见H3C SecPath防火墙内部服务器NAT访问所有源地址被替换问题
对端口回流问题的详述见Reference[1]
H3C还有一种技术叫dns-map,其实这玩意儿的思路和Great Fucking Wall的DNS污染如出一辙,都是将DNS服务器返回的IP地址替换掉,不过一个是替换成错误的,而另一个是替换成更准确的(可以通过内网直接访问的)。
References:
[1]端口回流与dns-map与域内NAT
[2]华为防火墙域之间inbound和outbound之间的区别!
[3]用传统的NAT方式替代H3C的DNS-MAP功能
[4]outbound与inbound的区别——华为
[5]linux 做防火墙端口回流问题
===
[erq]