写给SaaS创业公司的安全基础知识

头两天看到了写给SaaS创业公司的安全101,内容涵盖了不少,非常值得一读,其实不光是给SaaS企业了,其他公司一样适用。

我摘了几个贴在这里

  • 密码共享和密码管理,所有系统都有一个终极的Admin账户,这个账户是共享的,防止这个人的单点故障,同时一旦共享了,那么密码是需要加密共享的,所以要有密码管理。
  • 全盘加密,Mac/Windows都有很好的加密方法了,几乎一键加密。
  • 买3个以上域名,第一个用于公开的品牌和企业的邮箱。第二个用于自己的SaaS服务,比如googleapis.com之类的。第三个域名用于内部的后勤支持,比如公司vpn等基础设施等等,而且这个域名最好匿名,这样别人就难以猜测了。营销邮件应该使用独立的域名,以防反垃圾系统标记后影响公司业务邮件来往。
  • 所有地方都使用HTTPS
  • API密钥,每一个客户都应该拥有不同的API钥匙对。
  • 物理安全:
    • 使用屏保,并且从屏保恢复需要输入密码。
    • 不要使用U盘,这是入侵的最方便最直接的方法了。
  • 企业内部沟通用Slack,客户间沟通用邮件,国内可以适用企业内部用BearyChat,客户沟通用邮件+微信。
  • 认证服务支持SSO和OAuth
  • 备份
    • 冷备/热备/异地容灾
    • 自动化备份
    • 定期恢复演练
    • 备份加密
  • 防火墙和访问权限
    • 服务访问需要认证,比如ElasticSearch, MongoDB, MySQL等
    • Review防火墙设置,只能允许必要的服务和端口开放。
    • 自动扫描。

可以照这个列一个checklist,看看自己公司都做到了哪些?

消除Outlook的安装后反复欢迎提醒和Update无法更新的问题

Outlook for Mac 2016实在是太慢了,写个邮件都要卡顿半天,重新装了2011版来用,导出导入olm文件很是方便,这也是这几年来我一直使用outlook的一个主要原因。

遇到的问题是无法更新和欢迎界面每次都弹出。

其实就是一个权限的问题,我也懒的去找哪一个文件了,直接执行

find ~/Library -type f -user root -exec sudo chown `whoami` {} \;

问题解决!

伟大长城带来的痛苦

上个礼拜,全球最大的开源社区仓库Github被认证,带来的不便就不说了。

最近用了一个项目,大量的使用了Git Submodule,如果在CI服务器上来做这件事儿,就是问题多多。没有办法,我只能clone一个下来再把内容放到自己的git repo里去,把依赖于github的submodule都给去掉。

苦不堪言!

一毛钱股份

就算老公一毛钱股份都没拿到,在我心里,他依然是最牛逼的创业者 的文章上个礼拜被炒的火热,当事人很快就被扒出来了,最后陈CEO也出来解释了;

这事儿最重要的一点就是CEO老陈有没有给老韩承诺给股份?不管是口头的还是书面的,甚至比例都不重要,只是确定这个饼是不是存在。

如果没有,老韩媳妇现在要股份是理亏,最终是吃亏。

如果有,但是比例没有定,那么一个股份制公司运行了7年之久还没有确定的股份比例,我只能说老陈这个CEO不是蠢就是坏!

  1. 至于老韩人家家里过什么样的生活和股份的获得没有任何关系!甚至有说老韩你7年买房、买车、结婚生子,日子已经过的不错了。呵呵,圣人不死大盗不止!这7年人家日子过的好坏,买了豪车别墅也和凭承诺拿股份没有任何的关系;这就好比是一个公司在创业初期,比尔盖茨投了钱或者精力,比尔盖茨过的生活也和能否获得这个公司股份是没有关系的,如果这公司有承诺比尔盖茨股份,那就按承诺来,如果没有那比尔盖茨也得吃瘪,还是和他个人的生活没有关系。同理,公司现在的经营情况,获利情况依然和老韩拿股份这事儿没关系,只和当时的承诺有关,与其他事都无关;

  2. 至于公司后面的发展老韩无法带队或者工作状态低迷,而且就老陈CEO的回复来看,是给发了200万分红之后出现的;这个情况还是和老韩获取股份没有关系,如果老韩入伙时没有承诺,老陈CEO就该早做决断,而不是把这个问题一拖再拖,而且是从2013年拖到了2017年。有承诺,即便是消极怠工也一样得给股份,请参考聚美优品陈欧在新加坡的公司一事;

  3. 发200万和发100万也和股份获得没有关系。注意,这个文章是老韩老婆发的,也许老韩只和老婆说了100万,也许公司只发了100万。这笔钱并不是老韩退出股份的报酬,所以该是多少股份还是得给多少股份。

说一千道一万,最重要的还是承诺;老陈没有承诺,老韩给公司干了7年,终了白干,这是老陈CEO辜负了老韩的信任;老陈给了承诺,终了没有兑现,这是老陈CEO的失信,甚至可以对簿公堂;老韩后期消极怠工,这是老韩不义;面对老韩消极怠工不做处理,这是老陈CEO失职;

结论:拖延症害死人啊!

那到底该不该给老韩股份呢?

有句话叫吃水不忘挖井人,老陈在最需要的时候,老韩跟他一起干,完成了公司的冷启动,你说他该不该拿股份?

再说了,老韩和老陈一起干的时候是降薪,经济学有个概念叫机会成本,老韩也许没有直接投入金钱,但是投入这家公司的机会成本是值得他拿这个股份的!

继续留在Mac OS X

macOS 10.12 发布之后我升级过了两次,但是体验都不是很好,本身系统的变化不大,但是带来的问题并不小,对我最大的影响是外接显示器之后的风扇狂转不止。甚至让我产生了它们要修复系统在老机器上运行过于流畅的bug了。

本身我自己的MBP也已经用了4年之久了,是应该更新一下了,然而对于新版MBP的失望,配件的短缺,看来我的MBP还要继续服役1年以上,等配件比较齐全的时候再下手了,希望到时候macOS能稳定一些。

我常读的Joel On Software主角,Joel Spolsky也表达了同样的

@spolsky: Sorry Apple. After 10 years loyalty, this latest MBPro with useless touchbar and unreliable keyboard was last straw. Switched to Dell XPS13👋

tweets

在阿里云ubuntu 16.04 LTS版本上安装gitlab-ce

需要安装一个gitlab-ce给大家用,最近把操作系统都换到ubuntu来了,这个ubuntu是阿里云定制过的。

清华大学又一个gitlab的镜像,但是阿里云无法连通,超时,但是单独curl又是好的,结果呢是阿里定制了/etc/apt/apt.conf文件,修改如下即可

Acquire::http::Proxy "http://mirrors.aliyun.com/";

内部用一个proxy连接的trick,添加一行即可使用清华的镜像了

Acquire::http::Proxy::mirrors.tuna.tsinghua.edu.cn "DIRECT";

selenium wait 和 iframe

还是从朋友那个小事儿做的时候弄出来的问题

  1. selenium 如何切换driver到一个ID设置为中文iframe?
  2. 遇到alert了怎么处理?
  3. 检查某个元素是不是出现了?

不要问我为啥id会用中文,说多了都是泪,总之这是一个一言难尽的问题,一句话,国有企业你懂的。

  1. 切换到特定的iframe/frame
driver.switch_to_frame(driver.find_element_by_id('some_id'))

这样就可以在这个frame/iframe里做相应的find element操作了,但是要记住操作完了要切换回来

driver.switch_to_default_content()

多层嵌套的iframe也没有问题,只要一步一步的切换进去就好了

  1. 接受alert

一个简单的方法就是预计有alert的地方,写上接受就好了

driver.switch_to.alert.accept()

这样很粗暴,但是也很有效,精细一些的做法看文档,比如:

  • 确认或者取消
from selenium.webdriver.common.alert import Alert
Alert(driver).accept()
Alert(driver).dismiss()
  • 读取alert的文字内容
Alert(driver).text
  • 认证的用户名和密码
driver.switch_to.alert.authenticate(username,password)
  • 输入内容
name_prompt = Alert(driver) name_prompt.send_keys(“Willian Shakesphere”) 
name_prompt.accept()
  1. 检查某个元素是否出现

以前的一个很粗暴的做法是time.sleep(N),但是这种情况下非常粗旷,selenium 提供了更精细的一些控制方法

  • 等待某个元素出现以后获取这个元素
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10) #10秒,超过这个时间就会raise Exception
element = wait.until(EC.element_to_be_clickable((By.ID,'someid')))
  • 这里的expected_conditions可以是下面的这些条件
    • title_is
    • title_contains
    • presence_of_element_located #元素可以找到
    • visibility_of_element_located #元素可见
    • visibility_of
    • presence_of_all_elements_located #所有元素可以被找到
    • text_to_be_present_in_element #元素中包含text
    • text_to_be_present_in_element_value #元素的value值包含text
    • frame_to_be_available_and_switch_to_it #iframe可以切换
    • invisibility_of_element_located #不可见元素被找到
    • element_to_be_clickable #不但可见,而且可点
    • staleness_of
    • element_to_be_selected #元素被选中
    • element_located_to_be_selected #
    • element_selection_state_to_be
    • element_located_selection_state_to_be
    • alert_is_present #弹框出现

这些基本覆盖了常见的情况了,足够用了,记得处理异常,否则就挂了。

Trump elected to be next president

做为一个中国人没什么太多资格去讨论一个外国元首,但是他作为一个影响全球的世界元首,对其他国家或多或少还是有影响的,从最近汇市和股市的尿性就可以看出来了,就这还没有上任呢。

至于Trump为啥能被选上呢?鬼知道,现在来看大家都归结于社交媒体的胜利。不无道理,以我之见,很多人选Trump的主要原因是想看到一些改变,而不是希拉里作为一个成熟政客的4年表演,她的表演和观海同志一样,who want repeat 4 years again? 而Trump能不能做到他说的make American great again, 未必吧,潜台词是American is not great anymore,但是即便是如此大家也愿意看到一些不太确定的变化吧,更何况Trump说的一些事情也是很多人想做的,比如限制非法移民和废除ObamaDon'tCare之类的。

至于现在的民族主义、孤立主义抬头,全世界的新潮流吧,从英国脱欧开始到现在的美国有可能转向保守主义等等,都有表明这个世界正在起变化。全球化进程是不是就此开始衰退,我倒没有太担心,从发达国家已经流出的工作岗位是不会再流回的,他们只是很有可能被另外一种更新的技术来取代。

今天这是卖白菜的操了卖白粉的心,多虑了,洗洗睡觉!

macOS 的ssh-add -K

macOS 10.12 开始ssh-add并不是默认将你的ssh-key添加进去了,所以需要额外配置一下

打开自己的ssh配置文件~/.ssh/config,加入如下内容

Host *
    UserKnownHostsFile /dev/null #这一句还好吧
    StrictHostKeyChecking no #这一句非常危险,结合上一句再加上dns劫持的话,再加上密码认证就很有泄漏密码的可能性
    ForwardAgent yes
    TCPKeepAlive yes
    IdentityFile ~/.ssh/id_rsa
    AddKeysToAgent yes

Selenium 连接一个已有的连接

帮朋友弄个东西,需要先登录,有一个不复杂的验证码,但是上OCR也太重,所以就先起一个driver,然后手工登录之后再连过来进行操作.

  • 先启动一个Driver和Session,并且打印出连接的URL和Session
url = driver.command_executor._url       #"http://127.0.0.1:60622/hub"
session_id = driver.session_id            #'4e167f26-dc1d-4f51-a207-f761eaf73c31'
  • 然后再连接过去
driver = webdriver.Remote(command_executor=url,desired_capabilities={})
driver.session_id = session_id

REF:
Stackoverflow: Connect to an already running instance of chrome using selenium in python