0%

如果文件或目录有扩展属性,则使用-l选项执行ls命令时,会在权限许可字段后面附加一个字符@。
如果文件或目录有扩展安全信息,则使用-l选项执行ls命令时,会在权限许可字段后面附件一个字符+。

If the file or directory has extended
attributes, the permissions field printed by the -l option is followed by
a ‘@’ character. Otherwise, if the file or directory has extended secu-
rity information, the permissions field printed by the -l option is fol-
lowed by a ‘+’ character.

详见man ls(1) on Max OS X

===
[erq]

Mac OS X系统上有些组和用户的帐号是下划线开头的,一般用于系统服务帐号,这只是一个命名习惯,没有什么特别之处。

下载解压

1
2
3
4
5
$ cd ~/Downloads
$ wget http://mirror.esocc.com/apache/tomcat/tomcat-7/v7.0.53/bin/apache-tomcat-7.0.53.tar.gz
$ cd /usr/local
$ sudo tar xvzf ~/Downloads/apache-tomcat-7.0.53.tar.gz
$ sudo ln -s apache-tomcat-7.0.53 tomcat

创建运行tomcat的非特权用户
使用root用户运行tomcat会有安全性方面的问题,如果tomcat被攻陷则整个系统就会沦陷。因此创建一个非特权用户来运行tomcat

首先选择一个User ID和Group ID,500以上的ID用于正常的用户,因此需要选择一个0-500之间的数字作为GID和UID。

列出当前系统组,用户及其ID

1
2
$ dscl . -list /Groups PrimaryGroupID sort -n -k 2
$ dscl . -list /Users UniqueID sort -n -k 2

这里选择101作为UID和GID,创建组和用户:

1
2
3
4
5
6
7
8
9
# dscl . -create /Groups/_tomcat PrimaryGroupID 101
# dscl . -create /Groups/_tomcat RealName "Tomcat Users"
# dscl . -create /Groups/_tomcat Password \\*
# dscl . -create /Users/_tomcat UniqueID 101
# dscl . -create /Users/_tomcat PrimaryGroupID 101
# dscl . -create /Users/_tomcat HomeDirectory /usr/local/tomcat
# dscl . -create /Users/_tomcat UserShell /usr/bin/false
# dscl . -create /Users/_tomcat RealName "Tomcat Administrator"
# dscl . -create /Users/_tomcat Password \\*

新创建用户的shell设置为/usr/bin/false,使其无法登录,密码设置为*为禁用账户。

设置tomcat目录权限

1
2
3
4
5
6
7
8
$ cd /usr/local/tomcat
# chmod 644 conf/*
# chown root:_tomcat conf/tomcat-users.xml
# chmod 640 conf/tomcat-users.xml
# mkdir conf/Catalina
# chown _tomcat:_tomcat conf/Catalina
# chown _tomcat:admin logs temp webapps work
# chmod 2770 logs temp webapps work

launchd脚本
写一个launchd包装脚本来启动tomcat,并且一直等待tomcat进程直到其退出。
/usr/local/tomcat/bin/tomcat-launchd.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/bin/sh

# tomcat-launchd.sh
#
# Wrapper script that starts Tomcat and waits for the Tomcat process
# to exit. This is needed for proper interaction with launchd.

#---------------------------------------------------------
# Helper functions
#---------------------------------------------------------

# NOTE: We are inheriting CATALINA_HOME from launchd, because its value
# was defined in the launchd plist configuration file.

function shutdown() {

# Bye Tomcat!
echo "Shutting down Tomcat... "
$CATALINA_HOME/bin/catalina.sh stop
echo "done."

# Cleaning up the temporary file
rm -f $CATALINA_PID
}

function startup() {

# Define the file where we want the Tomcat process ID to be stored.
export CATALINA_PID=$(mktemp /tmp/\`basename -s .sh $0\`.XXXXXX)
if \[ $? -ne 0 \]
then
echo "$0: Failed to create temporary file. Aborting."
exit 1
fi
rm -f $CATALINA_PID

# Let's go!
echo "Starting up Tomcat... "
. $CATALINA_HOME/bin/catalina.sh start

# Register the shutdown function as callback to execute when a signal
# is sent to this process.
#捕捉以下信号使tomcat关闭
trap shutdown HUP INT QUIT ABRT KILL ALRM TERM TSTP
echo "done."
}

function wait_for_tomcat_to_exit() {
echo "Waiting for Tomcat to exit (PID: \`cat $CATALINA_PID\`)... "
#等待tomcat进程退出
wait \`cat $CATALINA_PID\`
echo "done waiting for Tomcat to exit."
}

#---------------------------------------------------------
# Let's go
#---------------------------------------------------------

startup
wait_for_tomcat_to_exit

plist配置文件:
/usr/local/tomcat/conf/org.apache.tomcat.plist
[xml]




Label
org.apache.tomcat
ServiceDescription
Tomcat Servlet/JSP Server
UserName
_tomcat
GroupName
_tomcat
EnvironmentVariables

CATALINA_HOME
/usr/local/tomcat
JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home

ProgramArguments

/usr/local/tomcat/bin/tomcat-launchd.sh

StandardOutPath
/usr/local/tomcat/logs/launchd-stdout.log
StandardErrorPath
/usr/local/tomcat/logs/launchd-stderr.log
RunAtLoad

KeepAlive



[/xml]

JAVA_HOME变量的值由以下命令确定:

1
$ /usr/libexec/java_home

然后将plist文件符号链接到/Library/LaunchDaemons目录:

1
2
# cd /Library/LaunchDaemons
# ln -sfv /usr/local/tomcat/conf/org.apache.tomcat.plist

使用launchd管理tomcat
设置完成后,可以使用以下命令加载配置并启动tomcat

1
# launchctl load /Library/LaunchDaemons/org.apache.tomcat.plist

修改plist配置文件后重新加载配置:

1
2
# launchctl unload /Library/LaunchDaemons/org.apache.tomcat.plist
# launchctl load /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
2
# launchctl stop org.apache.tomcat
# launchctl start org.apache.tomcat

servlet api符号链接

1
2
# ln -sfv /usr/local/tomcat/lib/servlet-api.jar /usr/share/java/servlet-api.jar
# ln -sfv /usr/local/tomcat/lib/servlet-api.jar /usr/share/java/servlet-api-3.0.jar

References:
[1]installing Tomcat On Mac OS X

===
[erq]

传统unix系统中,wheel用户组是管理员组,只有该组的成员才可以通过su获取root权限。当然要对该组做特殊设置才可以做到这些限制。
wheel实际上已经成了管理员组的代名词。

配置wheel用户组

编辑文件
/etc/pam.d/su

1
2
3
4
5
6
7
8
9
10
#root使用su命令不需要密码
auth sufficient pam_rootok.so
#用户只有是wheel组的成员才可以su切换到root权限,如果不指定group=wheel,则默认的管理员组为root。
#这样设置有一个副作用,root用户也必须成为管理员成员或者显式的允许root不需要密码使用su
#这一行设置替代了/etc/login.defs文件中的SU_WHEEL_ONLY选项
auth required pam_wheel.so group=wheel
#管理员组的成员可以不用密码使用su
auth required pam_wheel.so trust
#nosu组的成员不允许使用su
auth required pam_wheel.so deny group=nosu

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
2
3
4
5
6
7
8
#request_mode db_name db_role address mask method options 
local database user auth-method \[auth-options\]
host database user address auth-method \[auth-options\]
hostssl database user address auth-method \[auth-options\]
hostnossl database user address auth-method \[auth-options\]
host database user IP-address IP-mask auth-method \[auth-options\]
hostssl database user IP-address IP-mask auth-method \[auth-options\]
hostnossl database user IP-address IP-mask auth-method \[auth-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
2
#map-name system-username database-username
admin john postgres

为某个认证方法指定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好用啊!