信息孤岛

“信息孤岛” (The information isolated island ),听着挺专业的一个词,前些天我就遇上了这个场景。查资料的时候无意中发现一个产品,对我们部门的一个同类产品有借鉴的意义,略微看了一下便发了邮件分享给大家。邮件发完后几分钟以后就有人回了邮件

晕,这个就是我们现在用的啊,XX的产品。。。。。。。

自家产品不认识,是有些尴尬。这是个饭后的谈资但更是所谓信息孤岛的一个典型案例。每个人的知识和能力是有限的,每个个体都是一个“知识孤岛”,通过团队沟通,交流,团队间可能会组成一个“知识群岛”,如果有更好的知识协助和知识管理的方法,则有可能形成一个“知识大陆”。

目前知识管理系统 KMS (knowledge management system)有很多,我从一年前开始就不断试用了业界的各种KMS软件尝试找到一款适合的KMS软件。但是很多像sharepoint之类的KMS注重的是管理,而我觉得KMS的精髓在于知识的分享。分享知识的奇妙之处正在于,越分享,知识越是增值。

 

我理想中的KMS软件有以下特点:

  1. KMS必须是每个人都可以维护,更新,发布的。才能确保KMS的生命力。对于文中的错误,任何能都能直接修改,并保存。通过保存多版本来保证不被恶意修改。类似百度百科,互动百科,wikipedia。
  2. 便于编辑,最好是所见即所得的编辑方式,不需要如wikipedia一样掌握新的语法。类似博客。
  3. 在编辑时能直接粘贴Word等还保持原始格式。类似织梦CMS。
  4. 上传的pdf,ppt,word,excel等附件能在web直接展示,而不需要下载附件打开后才能看到。类似slideshare。
  5. 必须提供全文检索功能 。类似google
  6. 提供良好的上传下载功能。类似dropbox,百度云等等。
  7. 要有积分,等级制度,让分享多的人有成就感。

理想要求太多,结果是一直没有找到一个能满足所有要求的软件来进行知识管理和分享。但是根据我的经验来讲,缺少其中任何一个功能,都无法进行有效的知识分享。

写到这,想想我是不是应该开发这个理想的产品。因为市场上没有这样的产品,而大家又有这样的强烈需求。而开发的时候自己的需求才是最好的需求,不需要访谈任何人,不需要到处征求意见,能让自己,让团队爱不释手的产品就是一个真正吸引人的产品。

 

 

 

杂谈:未来的路

人的一生很短暂,算算只有短短几万天,所以人最宝贵的财富是时间,相同的时间里如何才能达到功用最大化(maximization of utility) ,那选择走什么样的路,做什么样的事,就必须细心考量了。

功用最大化做到了么,其实想想就知道,没有!不管是我,或者是我身边很多的同事。其实我们都可以做的更好,好很多。我很身边有很多很优秀的人一样,埋在琐事中一天一天浪费着时间和才华,现在回头想想觉得很可惜。勤奋,认真,用心的做事情很重要,但是就像现代管理学之父彼得·德鲁克(Peter Drucker)曾在他的著作《论管理》(On the Profession ofManagement)中说:

没什么比高效地做一件根本不该做的事更加徒劳的了。

所以更重要的是选择做正确的事情。只有正确的事才能让你做到功用最大化。

那我们是要马上辞职,换个平台?对员工辞职,马云说的挺到位

员工的离职原因林林总总,只有两点最真实:1、钱,没给到位;2、心,委屈了。这些归根到底就一条:干得不爽。员工临走还费尽心思找靠谱的理由,就是为给你留面子,不想说穿你的管理有多烂、他对你已失望透顶。 仔细想想,真是人性本善。作为管理者,定要乐于反省。

按照马斯洛需求层次理论,人的需求分为五种,像阶梯一样从低到高,按层次逐级递升,分别为:生理上的需求,安全上的需求,情感和归属的需求,尊重的需求,自我实现的需求。

画大饼可以,满足了员工自我实现的需求。但是生活中终究是现实的,没有底层的支撑,那终究不会长久。所以大家崇拜的好公司很重要的特点,就是满足了马云说的亮点,钱给够了,心不委屈了。一项委屈了,那还能撑一撑。两个都委屈了,那就只能走人了。

那未来走什么样的路?我们都说失败是成功之母,或者说learn to fail。但是从失败中学习我们只是知道某一条路会失败,但是仍然没有找到正确的路。所以更应该学习的是成功,向最成功的行业的顶尖学习。现在所作的这种软件实施,外包行业,我不知道在全国,或者世界范围内哪家是最成功的。可以做到如同文思海辉那般好几万人。但是这种几万人的公司又如何?拿着可怜的利润,微薄的薪资福利。其实这种软件实施,外包的行业大家都过得很辛苦,所以你说实施行业要留人,涨薪涨不起,那就只能靠画大饼了。都说老大们爱画饼,我真的很理解。

所以我曾经想我不再做实施了,做实施的出路在哪里,还真没看到,老大们过着的生活也不是我想要的。

所以就像刚才说的那样,要向成功者学习。反观现在成功的公司在做什么,都是在做产品,微软不是在为每个人定制软件,谷歌也不是在做提数。做产品意味着可持续,可复制的成功。发达的互联网环境和日渐完善的网上支付体系,意味着不再需要向传统产品一样耗费大量资源进行渠道部署,甚至不再需要传统渠道。的出现。

想改行去做产品,而不是实施行业这种拼人力的苦B现状。退一万步讲,即便还做不了产品,想想这么累,经济压力有那么大,那还真不如去外企,至少人家钱也给的比较足,出差还住着四五星的宾馆,两周还能回家一趟,家庭矛盾也不会这么大。

说了半天,其实就是一句话!只有心里有梦,就一定会成功!

使用ORACLE GATEWAY 与Greenplum HAWQ 1.0 互通

现场环境:Oracle 11g 64bit linux edition

Greenplum Pivotal HD HAWQ 1.0

操作系统 RHEL 6.3 x86_64

为了实现在Oracle中直接访问HAWQ中的数据,需要首先安装Oracle Gateway 11g x86_64 linux edition

 

需要安装的软件:Oracle Gateway 11g x86_64 linux edition

DATADIRECT_CONNECT64_ODBC_7.0.1for Greenplum (必须是7版本的,6的不行,rhel6带的unixodbc也不行)

 

( 后记,Oracle 11g database server 中貌似也带了hs的功能,直接使用database server 当gateway应也可,不用再单独安装gateway)

安装路径: Oracle Gateway:/home/oracle/product/11.2.0/tg_1

Datadirect ODBC :/home/oracle/ddodbc

Oracle database :/home/oracle/app/oracle/product/11.2.0/dbhome_1

 

配置:

修改/home/oracle/product/11.2.0/tg_1/hs/admin/initdg4odbc.ora

# This is a sample agent init file that contains the HS parameters that are
# needed for the Database Gateway for ODBC
#
# HS init parameters
#
HS_FDS_CONNECT_INFO = Greenplum
#HS_FDS_TRACE_LEVEL = 0
HS_FDS_TRACE_LEVEL= ODBC
HS_FDS_TRACE_FILE_NAME = /home/oracle/odbc_trace.log
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so
HS_FDS_SUPPORT_STATISTICS = FALSE
#HS_LANGUAGE=AMERICAN_AMERICA.WE8ISO8859P1
HS_LANGUAGE = AMERICAN_AMERICA.UTF8
HS_FDS_TIMESTAMP_MAPPING = “TIMESTAMP(6)”
HS_FDS_FETCH_ROWS=1
#HS_FDS_SQLLEN_INTERPRETATION=32
HS_KEEP_REMOTE_COLUMN_SIZE=LOCAL
HS_NLS_NCHAR = UCS2
#
# ODBC specific environment variables
#
set ODBCINI=/etc/odbc.ini
set ODBCINST=/etc/odbcinst.ini

修改/home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

备注,此处直接使用database的listener。未使用gateway的listener ,在文件后追加:

SID_LIST_LISTENER =
        (SID_LIST =
                (SID_DESC =
                        (SID_NAME = dg4odbc)
                        (ORACLE_HOME =/home/oracle/product/11.2.0/tg_1 )
                        (ENV=”LD_LIBRARY_PATH=/usr/local/lib:/home/oracle/product/11.2.0/tg_1/lib:/home/oracle/ddodbc/lib”)
                        (PROGRAM = dg4odbc)
                )
        )
)
修改/home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora
增加:
dg4odbc  =
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))
    (CONNECT_DATA=(SID=dg4odbc))
    (HS=OK)
  )
修改/etc/odbc.ini
[oracle@server3 admin]$ cat /etc/odbc.ini
[ODBC Data Sources]
Greenplum=Greenplum
[ODBC Data Sources]
Greenplum Wire Protocol=DataDirect 7.0 Greenplum Wire Protocol
[ODBC]
IANAAppCodePage=4
InstallDir=/home/oracle/ddodbc
Trace=0
TraceFile=odbctrace.out
TraceDll=/home/oracle/ddodbc/lib/ddtrc26.so
[Greenplum]
Driver=/home/oracle/ddodbc/lib/ddgplm26.so
Description=DataDirect 7.0 Greenplum Wire Protocol
AlternateServers=
ApplicationUsingThreads=1
ConnectionReset=0
ConnectionRetryCount=0
ConnectionRetryDelay=3
Database=haier
DefaultLongDataBuffLen=2048
EnableDescribeParam=0
EnableKeysetCursors=0
EncryptionMethod=0
ExtendedColumnMetadata=0
FailoverGranularity=0
FailoverMode=0
FailoverPreconnect=0
FetchTSWTZasTimestamp=0
FetchTWFSasTime=0
HostName=server3
InitializationString=
KeyPassword=
KeysetCursorOptions=0
KeyStore=
KeyStorePassword=
LoadBalanceTimeout=0
LoadBalancing=0
LoginTimeout=15
LogonID=
MaxPoolSize=100
MinPoolSize=0
Password=
Pooling=0
PortNumber=54321
QueryTimeout=0
ReportCodepageConversionErrors=0
TransactionErrorBehavior=1
XMLDescribeType=-10
Charset=utf8
[ODBC]
TraceFile=/tmp/sql.log
Trace=1

 

 

修改/etc/odbcinst.ini

[ODBC Drivers]
DataDirect 7.0 Greenplum Wire Protocol=Installed
[ODBC Translators]
OEM to ANSI=Installed
[Administrator]
HelpRootDirectory=/home/oracle/ddodbc/adminhelp
[ODBC]
#This section must contain values for DSN-less connections
#if no odbc.ini file exists. If an odbc.ini file exists,
#the values from that [ODBC] section are used.
[DataDirect 7.0 Greenplum Wire Protocol]
Driver=/home/oracle/ddodbc/lib/ddgplm26.so
Setup=/home/oracle/ddodbc/lib/ddgplm26.so
APILevel=0
ConnectFunctions=YYY
DriverODBCVer=3.52
FileUsage=0
HelpRootDirectory=/home/oracle/ddodbc/help
SQLLevel=0

 

重启listener

lsnrctl status 中应有一下内容:

Listening Endpoints Summary…
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=server3)(PORT=1521)))
Services Summary…
Service “dg4odbc” has 1 instance(s).
  Instance “dg4odbc”, status UNKNOWN, has 1 handler(s) for this service…
而后在数据库中创建dblink,注意用户名和密码需要使用双引号

create database link DBLINK
connect to “gpadmin” identified by “gpadmin”
using ‘dg4odbc’;

执行sql语句即可返回成功(注意HAWQ中的表名和字段名需要使用双引号,用小写表示):

select count(*) from “poc1″@dblink;

 

我的2012

2012静静的过去了,有成长,也有失落。曾经迷茫过,但是我想我已经知道我需要什么。

我要走什么样的路,需要什么,问过自己很多次。

2012心得,听过马云创业的故事,不在乎年纪,心里永远不要放弃自己的梦,记得要走的路。

2012最有心得的书,《REWORK 》 < The Lean Startup>

HADOOP 的安全性

背景

当Hadoop在2004年开始开发的时候,对如何创建一个安全的分布式计算式环境上没有考虑,Hadoop框架对用户及服务的验证和授权严重不足,用户可以仿冒任意一个HDFS和mapreduce上的用户,恶意的代码可以以任何一个用户提交到Job tracker,尽管在版本0.16以后, HDFS增加了文件和目录的权限,但由于用户无需认证,HDFS的权限控制也极其容易绕过,允许一个用户伪装成任意一个用户,同时计算框架也没有进行双向验证,一个恶意的网络用户可以模拟一个正常的集群服务加入到hadoop集群,去接受JobTracker, Namenode的任务指派。

此时HADOOP要安全只能靠严格的的网络隔离,能访问hadoop集群的用户都是完全可信赖的用户。

到了2009年,关于hadoop安全性的讨论已经接近白热化了,安全被作为一个高优先级的问题摆了出来,Hadoop 2010年的开发计划就包含的用户与服务的双向认证,并且对终端用户透明。具体可参见【HADOOP-4487 Security features for Hadoop7】

安全设计时有以下6大目标:

1.2 Requirements

1. Users are only allowed to access HDFS files that they have permission to access.

2. Users are only allowed to access or modify their own MapReduce jobs.

3. User to service mutual authentication to prevent unauthorized NameNodes, DataNodes, JobTrackers, or TaskTrackers.

4. Service to service mutual authentication to prevent unauthorized services from joining a cluster’s HDFS or MapReduce service.

5. The acquisition and use of Kerberos credentials will be transparent to the user and applications, provided that the operating system acquired a Kerberos Ticket Granting Tickets (TGT) for the user at login.

6. The degradation of GridMix performance should be no more than 3%.

为了达到这目标,开发者决定使用kerberos进行认证。选择kerberos而非SSL基于以下理由:

1. kerberos使用对称密钥可以达到更高的性能,比使用公钥的SSL更快。

2. 简化了用户管理。例如,取消一个用户只需要简单的将用户从KDC里面删除即可,而如果使用SSL就需要生成证书注销列表(CRL) 并分发到所有服务器。

Hadoop的安全设计有以下七大假设

1.For backwards compatibility and single-user clusters, it will be possible to configure the cluster with the current style of security.

2. Hadoop itself does not issue user credentials or create accounts for users. Hadoop depends on external user credentials (e.g. OS login, Kerberos credentials, etc). Users are expected to acquire those credentials from Kerberos at operating system login. Hadoop services should also be configured with suitable credentials depending on the cluster setup to authenticate with each other.

3. Each cluster is set up and configured independently. To access multiple clusters, a client needs to authenticate to each cluster separately. However, a single sign on that acquires a Kerberos ticket will work on all appropriate clusters.

4. Users will not have access to root accounts on the cluster or on the machines that are used to launch jobs.

5. HDFS and MapReduce communication will not travel on untrusted networks.

6. A Hadoop job will run no longer than 7 days (configurable) on a MapReduce cluster or accessing HDFS from the job will fail.

7. Kerberos tickets will not be stored in MapReduce jobs and will not be available to the job’s tasks. Access to HDFS will be authorized via delegation tokens as explained in section 4.1.

以上七个假设基本就是Hadoop安全设计的七大安全缺陷。了解以后也就可以更有针对的对安全问题进行防范。

为了保证开发进度以及保证向后兼容,开发者在设计过程中对安全设计进行了部分妥协,首先新的设计要求终端用户不能在集群中的任何机器上拥有高权限的管理帐户,例如root。如果终端用户对集群中的机器拥有root权限,他就可以发现 Delegation Tokens, Job Tokens, Block Access Tokens或者symmetric encryption keys ,进而颠覆整个系统的安全保证。同时在开发过程中决定保证安全的新功能对于集群性能的影响不大于3%,这导致的开发者倾向使用对称加密算法,并且对网络传输不加密。

 部署hadoop kerberos方案后的安全顾虑

在hadoop新的安全设计中使用的 “threat model” 引起了一些新的安全性上的考虑。首先是SASL (Simple Authenticationand Security Layer)默认提供的安全保护,广泛分发的对称密钥。二是因为强调性能以及加密耗费资源的前提假设,hadoop使用了非常低的默认SASL  QoP (Quality of Protection),尽管SASL over kerberos其实可以做到更好。但hadoop的默认QoP只是进行认证,对于网络通信的完整性以及加密功能并未提供。Hadoop的PRC通信就可以被窃听及修改。同时新的Hadoop 安全设计依赖于HMAC-SHA1 这个对称密钥加密算法。因为Block Access Token 需要,HMAC-SHA1的对称密钥需要分发到Namenode以及所有的datanode机器,这意味着成百上千台的服务器。如果密钥被攻击者发现那么所有datanode上的数据都极其容易受到攻击。只要知道DATAID,攻击者就可以仿冒一个Block Access Token ,进而将hadoop的安全行降低到上一个版本的水平。而且HDFS Proxy使用的是基于IP的认证。一旦获得了HDFS Proxy Server的访问权,就可以读取HDFS Proxy Server 所被授权的所有数据。

二.CDH 4 mrv1 与kerberos集成

测试使用版本如下:

kerberos server 版本:krb5-server-1.9-33.el6.x86_64

Hadoop 版本: CDH4 W/ MRV1

操作系统版本:Redhat Enterprise Linux 6 update 3 64bit

JAVA版本:jdk-6u35-linux-x64

 

服务器名 IP 用途
rhel227.hadoop.hylandtec.com 172.16.130.227 Kerberos 服务器
rhel63.hadoop.hylandtec.com 172.16.130.234 Hadoop服务器

两台服务器均已经在DNS server上配置好正向及反向解析。hadoop.hylandtec.com 指向kerberos服务器。

安装kerberos服务器

作为测试,仅使用kerberos作为认证服务器,安装系统盘中的krb5-server-1.9-33.el6.x86_64.rpm,krb5-libs-1.9-33.el6.x86_64, krb5-workstation-1.9-33.el6.x86_64

kerberos realm 我们规划为HADOOP.HYLANDTEC.COM,以下配置中注意realm 必须为大写!

编辑/etc/krb5.conf

[logging]

default = FILE:/var/log/krb5libs.log

kdc = FILE:/var/log/krb5kdc.log

admin_server = FILE:/var/log/kadmind.log

[libdefaults]

default_realm = HADOOP.HYLANDTEC.COM

dns_lookup_realm = false

dns_lookup_kdc = false

ticket_lifetime = 24h

renew_lifetime = 7d

forwardable = true

[realms]

HADOOP.HYLANDTEC.COM = {

kdc = rhel227.hadoop.hylandtec.com:88

admin_server = rhel227.hadoop.hylandtec.com:749

default_domain = HADOOP.HYLANDTEC.COM  }

[domain_realm]

.hadoop.hylandtec.com = HADOOP.HYLANDTEC.COM

hadoop.hylandtec.com = HADOOP.HYLANDTEC.COM

[kdc]

profile = /var/kerberos/krb5kdc/kdc.conf

以root用户执行,按照提数输入master key:

 kdb5_util create -s

编辑/var/kerberos/krb5kdc/kdc.conf 文件。设置如下:

[kdcdefaults]

kdc_ports = 88

kdc_tcp_ports = 88

[realms]

HADOOP.HYLANDTEC.COM = {

#master_key_type = aes256-cts

max_renewable_life = 7d

max_life = 2d 0h 0m 0s

default_principal_flags = +renewable

krbMaxTicketLife = 172800

krbMaxRenewableAge = 604800

acl_file = /var/kerberos/krb5kdc/kadm5.acl

dict_file = /usr/share/dict/words

admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab

supported_enctypes =  aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal

}

编辑/var/kerberos/krb5kdc/kadm5.acl 文件,配置如下:

*/[email protected]    *

执行以下命令,新增root用户

kadmin.local  -q “addprinc root/[email protected]

配置完成后执行以下命令启动kerberos服务:

service krb5kdc start

service kadmin start

经配置好的/etc/krb5.conf 文件分发至hadoop各台机器即可。kerberos服务器安装完成。

 

HADOOP kerberos 配置

按照官方文档配置即可,没有问题。

https://ccp.cloudera.com/display/CDH4DOC/Configuring+Hadoop+Security+in+CDH4

有时候kerberos出错的提示很不明朗的时候。设置如下环境变量很有帮助:

export HADOOP_OPTS=”-Dsun.security.krb5.debug=true”

参考资料:

【1】 Hadoop Securit Design  

【2】Hadoop Security Design Just Add Kerberos? Really?

【3】Hadoop Security Overview

【4】Hadoop Kerberos安全机制介绍

【5】Configuring Hadoop Security in CDH4

 

RFC 3961

Kerberos ETypes Kerberos加密类型代码

 

	encryption type                etype      section or comment
      -----------------------------------------------------------------
      des-cbc-crc                        1             6.2.3
      des-cbc-md4                        2             6.2.2
      des-cbc-md5                        3             6.2.1
      [reserved]                         4
      des3-cbc-md5                       5
      [reserved]                         6
      des3-cbc-sha1                      7
      dsaWithSHA1-CmsOID                 9           (pkinit)
      md5WithRSAEncryption-CmsOID       10           (pkinit)
      sha1WithRSAEncryption-CmsOID      11           (pkinit)
      rc2CBC-EnvOID                     12           (pkinit)
      rsaEncryption-EnvOID              13   (pkinit from PKCS#1 v1.5)
      rsaES-OAEP-ENV-OID                14   (pkinit from PKCS#1 v2.0)
      des-ede3-cbc-Env-OID              15           (pkinit)
      des3-cbc-sha1-kd                  16              6.3
      aes128-cts-hmac-sha1-96           17          [KRB5-AES]
      aes256-cts-hmac-sha1-96           18          [KRB5-AES]
      rc4-hmac                          23          (Microsoft)
      rc4-hmac-exp                      24          (Microsoft)
      subkey-keymaterial                65     (opaque; PacketCable)