Digest | Docker安全攻略, Python数据工程师指南

326 阅读6分钟

一份2021年03月14日的信息流提炼

原发布地址:Digest | Docker安全攻略, Python数据工程师指南

每天学点机器学习

Python编程和数值方法:工程师和科学家指南

原文:Python Programming and Numerical Methods: A Guide for Engineers and Scientists

第25章 介绍机器学习

机器学习,顾名思义,就是试图让计算机具备学习能力,让计算机能够从数据或者过去的经验中学习。机器学习算法在我们生活中的很多地方都有应用,你可能没有意识到。例如,你智能手机上的语音助手,ATM机识别存款支票,你的电子邮件提供商自动将好的邮件和垃圾邮件分开,自动驾驶汽车在没有司机的情况下行驶,在一些安检处进行面部识别,还有很多例子

机器学习的类型

基本两个大类,Supervised 和 Unsupervised 。中文翻译过来是监督学习和无监督学习。这里觉得日语的翻译更为直观:有教师的学习和无教师的学习。

Supervised: 数据分类和数据预测(回归)。

Unsupervised: 聚类,降维。这里的理解是聚类是为了学习隐藏特征进行分类,降维是为了降低数据的理解难度也方便可视化。

机器学习的组成
  • representation 数据的表示

  • tunable model 可调模型

  • optimization algorithm 优化算法来调整模型

  • trained model 训练完成的模型


很有趣的是在HN下一个关于python的评论:

在过去的十几年里,我一直是数值/科学计算领域的一个奇葩,因为我大多拒绝使用 Python 进行严肃的数值编程。

Python社区在制作一套科学软件方面做得非常出色。数值库和绘图在Python中非常出色。Sympy和Sage都是非常有野心的,在我看来,是相当成功的项目。那么问题出在哪里呢?

长久性和稳定性。随你怎么嘲笑它,但老掉牙的FORTRAN代码,以及在过去20年里的C和C++,是严肃的科学应用的基石。Python通常不是。

显然,我是一个 "程序员的程序员",不过这可能是一个暗示,为什么Lisp仍然不适合科学家使用。大多数科学家不知道或不关心堆栈分配是什么。

每天学点运维

Docker安全攻略

原文:Docker Security Cheat Sheet

  • RULE #0 - 保持Host和Docker更新

    • 为了防止已知的、容器逃逸的漏洞,这些漏洞通常会升级到root/administrator权限,给Docker Engine和Docker Machine打补丁是至关重要的。容器(不同于虚拟机)与主机共享内核,因此在容器内执行的内核漏洞会直接攻击主机内核。
  • RULE #1 - 不要暴露Docker守护进程套接字(即使是对容器)

    • 不要启用tcp Docker daemon socket。如果你在运行docker daemon时使用-H tcp://0.0.0.0:XXX或类似情况,你就会暴露出对Docker daemon的未加密和未认证的直接访问。
    • 不要将/var/run/docker.sock暴露给其他容器。
  • RULE #2 - 设置一个用户

    • 配置容器使用无权用户是防止特权升级攻击的最佳方式。

    • # 方法1:使用 -u option,例如:
      docker run -u 4000 alpine
      # 方法2:在Dockerfile中添加用户,例如:
      FROM alpine
      RUN groupadd -r myuser && useradd -r -g myuser myuser
      <HERE DO WHAT YOU HAVE TO DO AS A ROOT USER LIKE INSTALLING PACKAGES ETC.>
      USER myuser
      
  • RULE #3 - 限制能力(只授予容器所需的特定能力)。

    • Linux内核能力是一组可以被特权者使用的权限。Docker,默认情况下,只运行一个能力子集。记住不要使用--privileged标志运行容器--这将会把所有的Linux内核功能添加到容器中。例如 docker run --cap-drop all --cap-add CHOWN alpine
  • RULE #4 - 增加-no-new-privileges标志

    • 始终以 --security-opt=no-new-privileges 运行 docker 映像,以防止使用 setuid 或 setgid 二进制文件升级权限。
  • RULE #6 - 使用Linux安全模块(seccomp、AppArmor或SELinux)

    • 首先,不要禁用默认的安全配置文件!可以考虑使用seccomp或AppArmor等安全配置文件。
  • RULE #7 - 限制资源(内存、CPU、文件描述符、进程、重启)

    • 避免DoS攻击的最好方法是限制资源。你可以限制内存、CPU、最大重启次数(--restart=on-failure:<number_of_restarts>)、最大文件描述符数量(--ulimit nofile=<number>)和最大进程数量(--ulimit nproc=<number>)。
  • RULE #8 - 将文件系统和卷设置为只读

    • 使用--read-only标志以只读文件系统运行容器。例如docker run --read-only alpine sh -c 'echo "whatever" > /tmp'
    • 如果容器内的应用程序需要临时保存一些东西,可以将 --read-only 标志和 --tmpfs 结合起来,像这样。docker run --read-only --tmpfs /tmp alpine sh -c 'echo "whatever" > /tmp/file
    • 此外,如果volume仅用于读取,将它们挂载为只读,它可以通过附加:ro-vdocker run -v volume-name:/path/in/container:ro alpine
  • RULE #9 - 使用静态分析工具

  • RULE #10 - 至少将日志设置为INFO级别。

    • 在docker-compose中配置日志级别。docker-compose --log-level info up
  • Rule #11 - 在构建时对Docker文件进行过滤

    • 在编写Docker文件时,可以通过遵循一些最佳实践来防止许多问题。在构建管道中添加一个安全interter作为步骤,可以很好地避免进一步的麻烦。一些值得检查的问题是

      • 确保指定了USER指令

      • 确保基础镜像有固定版本。

      • 确保操作系统包有固定版本。

      • 使用COPY, 避免 ADD

      • 避免使用apt/apk升级。

      • 避免在RUN指令中使用curl

HN评论:运行Docker容器的时候加上--read-only,迫使你对所有可写数据使用显式可写卷/绑定挂载......这不仅仅是安全方面的好处,你还可以避免整类问题,比如:

  • 最小化 "docker重启"(保留overlayfs的变化)和容器重新创建(将overlayfs恢复到镜像状态)之间的差异。

  • 容器重新部署时数据意外丢失,因为数据意外地被写入覆盖层fs而不是卷。

  • /var/lib/docker中的磁盘空间意外耗尽,因为数据被写在卷外。

  • 过多的overlayfs写入引起的性能问题(存储驱动程序和/var/lib/docker不一定是为IO性能设计的)。

其他值得阅读

  • ASK HN: 你是怎样写文档的?Ask HN: How Do You Write Documentation
    • 架构(Architecture),教程(Tutorials),参考(Reference)
    • C4 model: 可视化软件架构。4级表达:系统上下文,容器,组件,代码。
  • 分享一次完整的源码阅读过程
    • 首先熟悉官方文档
    • 找到核心代码的位置,从入口文件开始,一步步看
    • 遇到看不懂的地方可以先打个备注,源码不是一遍就能看懂的