最小权限的容器编排
在这篇文章中,我们将讨论容器编排器安全模型中没有考虑到的、但是很重要的这方面的详细情况,以及 Docker 企业版中如何使用内置的编排性能、Swarm 模式,去克服这些问题。Media
via https://linux.cn/article-9712-1.html
在这篇文章中,我们将讨论容器编排器安全模型中没有考虑到的、但是很重要的这方面的详细情况,以及 Docker 企业版中如何使用内置的编排性能、Swarm 模式,去克服这些问题。Media
via https://linux.cn/article-9712-1.html
如何在 Linux 系统中结束结束进程或是中止程序
在 Linux 中有几种使用命令行或图形界面终止一个程序的方式。Media
via https://linux.cn/article-9715-1.html
在 Linux 中有几种使用命令行或图形界面终止一个程序的方式。Media
via https://linux.cn/article-9715-1.html
3 个 Python 模板库比较
你的下一个 Python 项目需要一个模板引擎来自动生成 HTML 吗?这有几种选择。Media
via https://linux.cn/article-9716-1.html
你的下一个 Python 项目需要一个模板引擎来自动生成 HTML 吗?这有几种选择。Media
via https://linux.cn/article-9716-1.html
使用 Buildah 创建小体积的容器
技术问题推动了开源协作的力量。Media我最近加入了 Red Hat,在这之前我在另外一家科技公司工作了很多年。在我的上一份工作岗位上,我开发了不少不同类型的软件产品,这些产品是成功的,但都有版权保护。不仅法规限制了我们不能在公司外将软件共享,而且我们在公司内部也基本不进行共享。在那时,我觉得这很有道理:公司花费了时间、精力和预算用于开发软件,理应保护并要求软件涉及的利益。时间如梭,去年我加入 Red Hat 并培养出一种完全不同的理念。Buildah 项目是我最早加入的项目之一,该项目用于构建 OCI (Open Container Initiative) 标准的镜像,特别擅长让你精简创建好的镜像的体积。那时 Buildah 还处于非常早期的阶段,包含一些瑕疵,不适合用于生产环境。刚接触项目不久,我做了一些小变更,然后询问公司内部 git 仓库地址,以便提交我做的变更。收到的回答是:没有内部仓库,直接将变更提交到 GitHub 上。这让我感到困惑,将我的变更提交到 GitHub 意味着:任何人都可以查看这部分代码并在他们自己的项目中使用。况且代码还有一些瑕疵,这样做简直有悖常理。但作为一个新人,我只是惊讶地摇了摇头并提交了变更。一年后,我终于相信了开源软件的力量和价值。我仍为 Buildah 项目工作,我们最近遇到的一个主题很形象地说明了这种力量和价值。这个标题为 Buildah 镜像体积并不小? 的工单由 Tim Dudgeon (@tdudgeon) 提出。简而言之,他发现使用 Buildah 创建的镜像比使用 Docker 创建的镜像体积更大,而且 Buildah 镜像中并不包含一些额外应用,但 Docker 镜像中却包含它们。为了比较,他首先操作如下:
via https://linux.cn/article-9719-1.html?utm_source=rss&utm_medium=rss
技术问题推动了开源协作的力量。Media我最近加入了 Red Hat,在这之前我在另外一家科技公司工作了很多年。在我的上一份工作岗位上,我开发了不少不同类型的软件产品,这些产品是成功的,但都有版权保护。不仅法规限制了我们不能在公司外将软件共享,而且我们在公司内部也基本不进行共享。在那时,我觉得这很有道理:公司花费了时间、精力和预算用于开发软件,理应保护并要求软件涉及的利益。时间如梭,去年我加入 Red Hat 并培养出一种完全不同的理念。Buildah 项目是我最早加入的项目之一,该项目用于构建 OCI (Open Container Initiative) 标准的镜像,特别擅长让你精简创建好的镜像的体积。那时 Buildah 还处于非常早期的阶段,包含一些瑕疵,不适合用于生产环境。刚接触项目不久,我做了一些小变更,然后询问公司内部 git 仓库地址,以便提交我做的变更。收到的回答是:没有内部仓库,直接将变更提交到 GitHub 上。这让我感到困惑,将我的变更提交到 GitHub 意味着:任何人都可以查看这部分代码并在他们自己的项目中使用。况且代码还有一些瑕疵,这样做简直有悖常理。但作为一个新人,我只是惊讶地摇了摇头并提交了变更。一年后,我终于相信了开源软件的力量和价值。我仍为 Buildah 项目工作,我们最近遇到的一个主题很形象地说明了这种力量和价值。这个标题为 Buildah 镜像体积并不小? 的工单由 Tim Dudgeon (@tdudgeon) 提出。简而言之,他发现使用 Buildah 创建的镜像比使用 Docker 创建的镜像体积更大,而且 Buildah 镜像中并不包含一些额外应用,但 Docker 镜像中却包含它们。为了比较,他首先操作如下:
$ docker pull centos:7$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEdocker.io/centos 7 2d194b392dd1 2 weeks ago 195 MB他发现 Docker 镜像的体积为 195MB。Tim 接着使用 Buildah 创建了一个(基于 scratch 的)最小化镜像,仅仅将 coreutils 和 bash 软件包加入到镜像中,使用的脚本如下:
$ cat ./buildah-base.sh#!/bin/bashset -x# build a minimal imagenewcontainer=$(buildah from scratch)scratchmnt=$(buildah mount $newcontainer)# install the packagesyum install --installroot $scratchmnt bash coreutils --releasever 7 --setopt install_weak_deps=false -yyum clean all -y --installroot $scratchmnt --releasever 7sudo buildah config --cmd /bin/bash $newcontainer# set some config infobuildah config --label name=centos-base $newcontainer# commit the imagebuildah unmount $newcontainerbuildah commit $newcontainer centos-base$ sudo ./buildah-base.sh$ sudo buildah imagesIMAGE ID IMAGE NAME CREATED AT SIZE8379315d3e3e docker.io/library/centos-base:latest Mar 25, 2018 17:08 212.1 MBTim 想知道为何 Buildah 镜像体积反而大 17MB,毕竟 python 和 yum 软件包都没有安装到 Buildah 镜像中,而这些软件已经安装到 Docker 镜像中。这个结果并不符合预期,在 Github 的相关主题中引发了广泛的讨论。不仅 Red Hat 的员工参与了讨论,还有不少公司外人士也加入了讨论,这很有意义。值得一提的是,GitHub 用户 @pixdrift 主导了很多重要的讨论并提出很多发现,他指出在这个 Buildah 镜像中文档和语言包就占据了比 100MB 略多一点的空间。Pixdrift 建议在 yum 安装器中强制指定语言,据此提出如下修改过的 buildah-bash.sh 脚本:
#!/bin/bashset -x# build a minimal imagenewcontainer=$(buildah from scratch)scratchmnt=$(buildah mount $newcontainer)# install the packagesyum install --installroot $scratchmnt bash coreutils --releasever 7 --setopt=install_weak_deps=false --setopt=tsflags=nodocs --setopt=override_install_langs=en_US.utf8 -yyum clean all -y --installroot $scratchmnt --releasever 7sudo buildah config --cmd /bin/bash $newcontainer# set some config infobuildah config --label name=centos-base $newcontainer# commit the imagebuildah unmount $newcontainerbuildah commit $newcontainer centos-baseTim 运行这个新脚本,得到的镜像体积缩减至 92MB,相比之前的 Buildah 镜像体积减少了 120MB,这比较接近我们的预期;然而,出于工程师的天性,56% 的体积缩减不能让他们满足。讨论继续深入下去,涉及如何移除个人语言包以节省更多空间。如果想了解讨论细节,点击 Buildah 镜像体积并不小? 这个链接。说不定你也能给出有帮助的点子,甚至更进一步成为 Buildah 项目的贡献者。这个主题的解决从一个侧面告诉我们,Buildah 软件可以多么快速和容易地创建体积最小化的容器,该容器仅包含你高效运行任务所需的软件。额外的好处是,你无需运行一个守护进程。这个镜像体积缩减的主题让我意识到开源软件的力量。来自不同公司的大量开发者,在一天多的时间内,以开放讨论的形式进行合作解决问题。虽然解决这个具体问题并没有修改已有代码,但 Red Hat 公司外开发者对 Buildah 做了很多代码贡献,进而帮助项目变得更好。这些贡献也吸引了更多人才关注项目代码;如果像之前那样,代码作为版权保护软件的一部分放置在私有 git 仓库中,不会获得上述好处。我只用了一年的时间就转向拥抱 开源方式,而且可能不会再转回去了。文章最初发表于 Project Atomic,已获得转载许可。via: https://opensource.com/article/18/5/containers-buildah作者:Tom Sweeney 选题:lujun9972 译者:pinewall 校对:wxy本文由 LCTT 原创编译,Linux中国 荣誉推出Media
via https://linux.cn/article-9719-1.html?utm_source=rss&utm_medium=rss
Pidgin:Skype for Business 的开源替代品
用可以和 Office 365 协同工作的开源软件换下你的专有化的沟通软件。Media
via https://linux.cn/article-9723-1.html
用可以和 Office 365 协同工作的开源软件换下你的专有化的沟通软件。Media
via https://linux.cn/article-9723-1.html
一些常见的并发编程错误
Go 并不会阻止一些因 Go 程序员粗心大意或者缺乏经验而造成的并发编程错误。在本文的下面部分将展示一些在 Go 编程中常见的并发编程错误,以帮助 Go 程序员们避免再犯类似的错误。Media
via https://linux.cn/article-9726-1.html
Go 并不会阻止一些因 Go 程序员粗心大意或者缺乏经验而造成的并发编程错误。在本文的下面部分将展示一些在 Go 编程中常见的并发编程错误,以帮助 Go 程序员们避免再犯类似的错误。Media
via https://linux.cn/article-9726-1.html
最好的 Linux 工具献给老师和学生们
Linux 与教育齐头并进。无论你是老师,学生还是管理员,你都会找到大量工具来帮助教育机构开放,灵活和强大。Media
via https://linux.cn/article-9722-1.html
Linux 与教育齐头并进。无论你是老师,学生还是管理员,你都会找到大量工具来帮助教育机构开放,灵活和强大。Media
via https://linux.cn/article-9722-1.html
基于 FUSE 的 Bittorrent 文件系统
使用 BTFS,你可以将种子文件或磁力链接挂载为目录,然后在文件树中作为只读目录。这些文件的内容将在程序读取时按需下载。Media
via https://linux.cn/article-9727-1.html
使用 BTFS,你可以将种子文件或磁力链接挂载为目录,然后在文件树中作为只读目录。这些文件的内容将在程序读取时按需下载。Media
via https://linux.cn/article-9727-1.html
如何在 Arch Linux 中降级软件包
有时候,你想更新到最新的版本,但你可能会被破损的包卡住。不要惊慌!在这种情况下,你可以简单地回滚到旧的稳定包。Media
via https://linux.cn/article-9730-1.html
有时候,你想更新到最新的版本,但你可能会被破损的包卡住。不要惊慌!在这种情况下,你可以简单地回滚到旧的稳定包。Media
via https://linux.cn/article-9730-1.html
探秘“栈”之旅(II):结语、金丝雀和缓冲区溢出
Media上一周我们讲解了 栈是如何工作的 以及在函数的序言prologue上栈帧是如何被构建的。今天,我们来看一下它的相反的过程,在函数结语epilogue中栈帧是如何被销毁的。重新回到我们的 add.c 上:
via https://linux.cn/article-9731-1.html?utm_source=rss&utm_medium=rss
Media上一周我们讲解了 栈是如何工作的 以及在函数的序言prologue上栈帧是如何被构建的。今天,我们来看一下它的相反的过程,在函数结语epilogue中栈帧是如何被销毁的。重新回到我们的 add.c 上:
int add(int a, int b){ int result = a + b; return result;}int main(int argc){ int answer; answer = add(40, 2);}简单的一个做加法的程序 - add.c在运行到第 4 行时,在把 a + b 值赋给 result 后,这时发生了什么:Media第一个指令是有些多余而且有点傻的,因为我们知道 eax 已经等于 result 了,但这就是关闭优化时得到的结果。leave 指令接着运行,这一小段做了两个任务:重置 esp 并将它指向到当前栈帧开始的地方,另一个是恢复在 ebp 中保存的值。这两个操作在逻辑上是独立的,因此,在图中将它们分开来说,但是,如果你使用一个调试器去跟踪,你就会发现它们都是自动发生的。在 leave 运行后,恢复了前一个栈帧。add 调用唯一留下的东西就是在栈顶部的返回地址。它包含了运行完 add 之后在 main 中必须运行的指令的地址。ret 指令用来处理它:它弹出返回地址到 eip 寄存器(LCTT 译注:32 位的指令寄存器),这个寄存器指向下一个要执行的指令。现在程序将返回到 main ,主要部分如下:Mediamain 从 add 中拷贝返回值到本地变量 answer,然后,运行它自己的结语epilogue,这一点和其它的函数是一样的。在 main 中唯一的怪异之处是,保存在 ebp 中的是 null 值,因为它是我们的代码中的第一个栈帧。最后一步执行的是,返回到 C 运行时库(libc),它将退回到操作系统中。这里为需要的人提供了一个 完整的返回顺序 的图。现在,你已经理解了栈是如何运作的,所以我们现在可以来看一下,一直以来最臭名昭著的黑客行为:利用缓冲区溢出。这是一个有漏洞的程序:void doRead(){ char buffer[28]; gets(buffer);}int main(int argc){ doRead();}有漏洞的程序 - buffer.c上面的代码中使用了 gets 从标准输入中去读取内容。gets 持续读取直到一个新行或者文件结束。下图是读取一个字符串之后栈的示意图:Media在这里存在的问题是,gets 并不知道缓冲区(buffer)大小:它毫无查觉地持续读取输入内容,并将读取的内容填入到缓冲区那边的栈,清除保存在 ebp 中的值、返回地址,下面的其它内容也是如此。对于利用这种行为,攻击者制作一个精密的载荷并将它“喂”给程序。在这个时候,栈应该是下图所示的样子,然后去调用 gets:Media基本的思路是提供一个恶意的汇编代码去运行,通过覆写栈上的返回地址指向到那个代码。这有点像病毒侵入一个细胞,颠覆它,然后引入一些 RNA 去达到它的目的。和病毒一样,挖掘者的载荷有许多特别的功能。它以几个 nop 指令开始,以提升成功利用的可能性。这是因为返回的地址是一个绝对的地址,需要猜测,而攻击者并不知道保存它的代码的栈的准确位置。但是,只要它们进入一个 nop,这个漏洞利用就成功了:处理器将运行 nop 指令,直到命中它希望去运行的指令。exec /bin/sh 表示运行一个 shell 的原始汇编指令(假设漏洞是在一个网络程序中,因此,这个漏洞可能提供一个访问系统的 shell)。将一个命令或用户输入以原始汇编指令的方式嵌入到一个程序中的思路是很可怕的,但是,那只是让安全研究如此有趣且“脑洞大开”的一部分而已。对于防范这个怪异的 get,给你提供一个思路,有时候,在有漏洞的程序上,让它的输入转换为小写或者大写,将迫使攻击者写的汇编指令的完整字节不属于小写或者大写的 ascii 字母的范围内。最后,攻击者重复猜测几次返回地址,这将再次提升他们的胜算。以 4 字节为界进行多次重复,它们就会更好地覆写栈上的原始返回地址。幸亏,现代操作系统有了 防止缓冲区溢出 的一系列保护措施,包括不可执行的栈和栈内金丝雀stack canary。这个 “金丝雀canary” 名字来自 煤矿中的金丝雀canary in a coal mine 中的表述(LCTT 译注:指在过去煤矿工人下井时会带一只金丝雀,因为金丝雀对煤矿中的瓦斯气体非常敏感,如果进入煤矿后,金丝雀死亡,说明瓦斯超标,矿工会立即撤出煤矿。金丝雀做为煤矿中瓦斯预警器来使用),这是对计算机科学词汇的补充,用 Steve McConnell 的话解释如下:计算机科学拥有比其它任何领域都丰富多彩的语言,在其它的领域中你进入一个无菌室,小心地将温度控制在 68°F,然后,能找到病毒、特洛伊木马、蠕虫、臭虫(bug)、炸弹(逻辑炸弹)、崩溃、爆发(口水战)、扭曲的变性者(双绞线转换头),以及致命错误吗?—— Steve McConnell 《代码大全 2》不管怎么说,这里所谓的“栈金丝雀”应该看起来是这个样子的:Media金丝雀是通过汇编来实现的。例如,由于 GCC 的 栈保护器 选项的原因使金丝雀能被用于任何可能有漏洞的函数上。函数序言加载一个魔法值到金丝雀的位置,并且在函数结语时确保这个值完好无损。如果这个值发生了变化,那就表示发生了一个缓冲区溢出(或者 bug),这时,程序通过 __stack_chk_fail 被终止运行。由于金丝雀处于栈的关键位置上,它使得栈缓冲区溢出的漏洞挖掘变得非常困难。深入栈的探秘之旅结束了。我并不想过于深入。下一周我将深入递归、尾调用以及其它相关内容。或许要用到谷歌的 V8 引擎。作为函数的序言和结语的讨论的结束,我引述了美国国家档案馆纪念雕像上的一句名言:(凡是过去 皆为序章what is past is prologue)。Mediavia:https://manybutfinite.com/post/epilogues-canaries-buffer-overflows/作者:Gustavo Duarte 译者:qhwdw 校对:wxy本文由 LCTT 原创编译,Linux中国 荣誉推出Mediavia https://linux.cn/article-9731-1.html?utm_source=rss&utm_medium=rss
4 种基于 Markdown 的幻灯片生成器
这些简单的幻灯片创建工具可以无缝地使用 Markdown,可以让你的演示添加魅力。Media
via https://linux.cn/article-9733-1.html
这些简单的幻灯片创建工具可以无缝地使用 Markdown,可以让你的演示添加魅力。Media
via https://linux.cn/article-9733-1.html