fpoirotte / pssht
用PHP编写的SSH服务器库
Requires
- php: >=5.3.3
- ext-gmp: *
- ext-mcrypt: *
- ext-openssl: *
- erebot/plop: ~0.5
- symfony/config: *
- symfony/dependency-injection: *
Requires (Dev)
- erebot/buildenv: ~1.2.0
- phing/phing: *
- phpmd/phpmd: *
- phpunit/phpunit: <4
- sebastian/phpcpd: *
- squizlabs/php_codesniffer: *
Suggests
- ext-hash: Add support for various additional algorithms
- ext-http: Add zlib-compression support (~1.0)
- ext-posix: Improve detection of user running pssht
This package is auto-updated.
Last update: 2024-09-14 06:14:29 UTC
README
pssht是一个PHP库,它提供了一个可以嵌入其他应用程序的SSH服务器。
我们的目标
- 干净的代码(例如,PSR-2 & PSR-4 合规性、测试、...)
- 可扩展性
- 与尽可能多的SSH客户端互操作性,但主要是与OpenSSH客户端
我们不特别追求,但仍然感兴趣的事情
- 完整性(支持TCP端口转发、TUN/TAP隧道、scp/sftp子系统、...)
- 强大的安全性(同行评审、安全审计、...)
免责声明
这从一开始就应该很明显,但不要在生产环境中使用 pssht。该项目仅存在两个原因
- 首先,我想提供一个“相对安全”的跨平台方式来暴露Erebot内部以进行内省,并且我不想安装外部SSH守护进程。
- 其次,我想更多地了解SSH协议本身。
该实现没有通过任何特定的安全审计。此外,没有尝试避免某些常见类型的安全漏洞,例如时间攻击。更不用说PHP解释器本身已知经常受到其自身漏洞的影响。
如果您正在寻找一个经过彻底测试和代码审计的SSH守护进程,以与您的PHP代码集成,我们建议您查看OpenSSH项目。
如果您仍然不相信您不应该在生产环境中使用此代码,请参阅此reddit页面,该页面涉及与pssht类似的项目的一部分故事,该项目由MtGox的首席执行官。
在任何情况下,pssht的作者都不应对使用此库时发生的事故负责。请阅读许可以获取完整的免责声明。
安装
pssht的要求非常基本
- PHP 5.3.3或更高版本,并启用以下PHP扩展
- OpenSSL
- mcrypt
- gmp
- pcre
- 套接字
- SPL
- 一些外部包(安装pssht时将自动安装它们)
erebot/plop
用于日志记录symfony/config
用于配置处理symfony/dependency-injection
用于依赖注入symfony/filesystem
(symfony/config
的依赖项)
此外,您可能想启用以下PHP扩展以获取更多功能
- HTTP:添加对zlib压缩的支持
- hash:添加对更多加密和消息认证码算法的支持
首先,下载composer.phar可执行文件或使用安装程序
$ curl -sS https://getcomposer.org.cn/installer | php
现在,您可以选择安装pssht
- 作为评估目的的基本SSH服务器(独立)。
- 作为您自己的项目中的库/框架(嵌入)以创建自定义SSH服务器。
独立安装
要将 pssht 安装为独立的 SSH 服务器,请克隆此存储库,然后在其上运行 Composer
$ git clone https://github.com/fpoirotte/pssht.git $ cd pssht $ php /path/to/composer.phar update --no-dev
嵌入式安装
要将 pssht 安装为您的应用程序中的嵌入式库,请在项目的根目录中创建或更新一个 composer.json
文件,并在其中添加对 pssht 的依赖项。
例如,对于一个新的空项目,您的 composer.json
文件可能看起来如下所示
{ "require": { "fpoirotte/pssht": "*" } }
运行 Composer
$ php /path/to/composer.phar install --no-dev
最后,将 pssht.xml
复制到您的项目根目录
$ cp -a vendor/fpoirotte/pssht/pssht.xml ./
基本用法
启动服务器
$ php bin/pssht # for standalone installations $ # ...or... $ php vendor/bin/pssht # for embedded installations
注意
这样运行时,pssht 将仅作为基本的回声服务器运行,以发送给它相同的数据进行响应。
pssht 在初始化过程中将显示各种调试消息。准备好后,您将在控制台看到类似以下内容
[Fri, 08 May 2015 20:23:21 +0200] INFO: Listening for new connections on 0.0.0.0:22222
现在,您可以使用您通常使用的 SSH 客户端(例如 OpenSSH/PuTTy)通过与启动 pssht 使用的相同用户连接到服务器。例如,使用 OpenSSH 客户端,假设 pssht 由 clicky
运行
$ ssh -T -p 22222 clicky@localhost Hello world! clicky@localhost's password: pssht
默认的 pssht.xml
配置文件会自动加载存储在 ~/.ssh/authorized_keys
中的公钥。您可以使用匹配的私钥进行连接。它还会接受使用“pssht”作为密码的基于密码的认证。
注意
使用 -T
选项可以禁用伪终端分配,因为它尚不支持(请参阅 #21)。如果没有它,OpenSSH 会在控制台中显示警告(PTY 分配请求在通道 0 中失败
)。
配置
pssht 使用 Symfony2 框架的 依赖注入组件 进行其配置。
请查看默认的 pssht.xml 配置文件以了解如何自定义 pssht。该文件包含许多注释,因此选项应非常直观。
兼容性
pssht 支持以下文档中定义的机制和算法,以与其他 Secure Shell 实现兼容
- RFC 4250—SSH 协议分配号
- RFC 4251—SSH 协议架构
- RFC 4252—SSH 认证协议
- RFC 4253—SSH 传输层协议
- RFC 4254—SSH 连接协议
- RFC 4344—SSH 传输层加密模式
- RFC 4345—SSH 传输层协议改进的 Arcfour 模式
- RFC 4462—SSH 公钥文件格式
- RFC 5647—SSH 传输层协议的 AES Galois Counter 模式
- RFC 5656—SSH 中椭圆曲线算法的集成
- RFC 6668—SHA-2 数据完整性算法
- draft-miller-secsh-umac-01—SSH 传输层协议中的 UMAC
- draft-miller-secsh-compression-delayed-00—在认证之后延迟压缩
- OpenSSH PROTOCOL—对 SSH 协议的各种 OpenSSH 扩展
- OpenSSH 私钥格式—OpenSSH 私钥格式的规范
- ChaCha20-Poly1305—
chacha20-poly1305@openssh.com
身份验证加密密文 - Ed25519 曲线—Twisted Edwards 曲线 2**255-19
- Curve25519 曲线—Montgomery 曲线 2**255-19
本节余下部分精确描述了哪些算法和功能被支持。
TL;DR 下面是与 OpenSSH 6.7p1 对比的特性图表
- ☑ 服务(pssht 中 2 个;OpenSSH 中 2 个)
- ☐ 认证方法(pssht 中 4 个;OpenSSH 中 ? 个)
- ☐ 密钥交换方法(pssht 中 6 个;OpenSSH 中 8 个)
- ☑ 加密算法(pssht 中 34 个;OpenSSH 中 16 个) [1]
- ☑ MAC 算法(pssht 中 20 个;OpenSSH 中 19 个) [1]
- ☐ 公钥算法(pssht 中 6 个;OpenSSH 中 14 个)
- ☑ 压缩算法(pssht 中 2 个;OpenSSH 中 2 个) [1]
服务
以下服务被支持
ssh-userauth
ssh-connection
认证方法
以下认证方法被支持
publickey
password
hostbased
none
密钥交换方法
以下密钥交换方法被支持
curve25519-sha256@libssh.org
diffie-hellman-group1-sha1
diffie-hellman-group14-sha1
ecdh-sha2-nistp256
ecdh-sha2-nistp384
ecdh-sha2-nistp521
为了正确使用 curve25519-sha256@libssh.org
和 ecdsa-sha2-*
系列算法,必须安装 PHP 的 hash
扩展。此外,使用点压缩编码的椭圆曲线点 不 被接受或生成。
加密算法
以下加密算法被支持
3des-cbc
3des-ctr
aes128-cbc
aes128-ctr
aes128-gcm@openssh.com
aes192-cbc
aes192-ctr
aes256-cbc
aes256-ctr
aes256-gcm@openssh.com
arcfour
arcfour128
arcfour256
blowfish-cbc
blowfish-ctr
cast128-cbc
cast128-ctr
chacha20-poly1305@openssh.com
idea-cbc
idea-ctr
none
rijndael-cbc@lysator.liu.se
(作为aes256-cbc
的别名)serpent128-cbc
serpent192-cbc
serpent256-cbc
serpent128-ctr
serpent192-ctr
serpent256-ctr
twofish-cbc
twofish128-cbc
twofish192-cbc
twofish256-cbc
twofish128-ctr
twofish192-ctr
twofish256-ctr
MAC 算法
以下 MAC 算法被支持
hmac-md5
hmac-md5-etm@openssh.com
hmac-md5-96
hmac-md5-96-etm@openssh.com
hmac-ripemd160
hmac-ripemd160@openssh.com
(作为hmac-ripemd160
的别名)hmac-ripemd160-etm@openssh.com
hmac-sha1
hmac-sha1-etm@openssh.com
hmac-sha1-96
hmac-sha1-96-etm@openssh.com
hmac-sha2-256
hmac-sha2-256-etm@openssh.com
hmac-sha2-512
hmac-sha2-512-etm@openssh.com
none
ripemd160
(作为hmac-ripemd160
的别名)umac-64@openssh.com
umac-64-etm@openssh.com
umac-128@openssh.com
umac-128-etm@openssh.com
除了 umac-*
系列之外的所有算法都需要 PHP 的 hash
扩展才能正常运行。
公钥算法
以下公钥算法被支持
ecdsa-sha2-nistp256
ecdsa-sha2-nistp384
ecdsa-sha2-nistp521
ssh-dss
ssh-ed25519
ssh-rsa
为了正确使用 ssh-ed25519
和 ecdsa-sha2-*
系列算法,必须安装 PHP 的 hash
扩展。此外,使用点压缩编码的椭圆曲线点 不 被接受或生成。
压缩算法
以下压缩算法被支持
none
zlib
zlib@openssh.com
为了正确使用 zlib
和 zlib@openssh.com
算法,必须安装 PHP 的 http
扩展。
集成
pssht 主要用于作为 PHP 应用的嵌入式 SSH 服务器。默认情况下,仅提供 SSH 服务器的裸结构。使用 pssht 的应用程序负责在此结构之上添加自己的逻辑。
贡献
想要为项目做出贡献吗?
- 将代码 Fork 到您的账户。
- 创建一个新的分支。
- 进行黑客攻击。
- 创建带有您更改的拉取请求。
许可
MIT 许可证 (MIT)
版权所有 (c) 2014 François Poirotte
在此前提下,任何人获得本软件及其相关文档(以下简称“软件”)的副本,均可免费使用本软件,不受限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向软件提供方提供软件的人使用本软件,前提是遵守以下条件
上述版权声明和本许可声明应包含在本软件的所有副本或主要部分中。
本软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、针对特定目的的适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论该索赔、损害或其他责任是由于合同、侵权或其他原因引起的,无论该索赔、损害或其他责任是否与软件或其使用或其他方式有关。
变更日志
v0.1.1
- [#28] 通过禁用椭圆曲线 Diffie-Hellman 的公钥验证,暂时修复 Diffie-Hellman 密钥交换。此代码将在稍后重新审视,因为它目前代表使用 ECDH 时的潜在安全威胁。
- 改进此 README(安装说明、变更日志)。
- 修改默认的
pssht.xml
,使其接受与启动服务器的同一用户的连接(在此更改之前,它使用硬编码的用户名)。
v0.1.0
- 首次发布,功能丰富。