s2n-tls는 단순하고, 작고, 빠르며, 보안을 최우선으로 하도록 설계된 TLS/SSL 프로토콜의 C99 구현입니다. 이는 Apache License 2.0에 따라 출시되고 라이센스가 부여됩니다.
s2n-tls는 "신호 대 잡음"의 약어이며 중요한 데이터와 같은 의미 있는 신호를 무작위 노이즈로 위장하는 거의 마법 같은 암호화 행위에 대한 고개를 끄덕입니다.
-- s2n-tls 발표
# clone s2n-tls
git clone https://github.com/aws/s2n-tls.git
cd s2n-tls
# install build dependencies
sudo apt update
sudo apt install cmake
# install a libcrypto
sudo apt install libssl-dev
# build s2n-tls
cmake . -Bbuild
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_INSTALL_PREFIX=./s2n-tls-install
cmake --build build -j $( nproc )
CTEST_PARALLEL_LEVEL= $( nproc ) ctest --test-dir build
cmake --install build
플랫폼에 맞게 s2n-tls를 빌드하는 방법에 대한 추가 지침은 s2n-tls 빌드 설명서를 참조하세요.
보안에 영향을 미치는 문제를 발견했다고 생각되면 보안 알림 프로세스를 따르십시오.
PR 제출, s2n-tls API 사용 등에 대해 질문이 있는 경우 이슈를 열어주세요.
s2n-tls는 Doxygen을 사용하여 공개 API를 문서화합니다. 최신 s2n-tls 문서는 GitHub 페이지에서 찾을 수 있습니다. 사용 가이드에서는 다양한 TLS 기능을 구성하고 사용하는 방법을 설명합니다.
s2n-tls의 이전 버전 또는 분기에 대한 문서를 로컬에서 생성할 수 있습니다. 문서를 생성하려면 doxygen을 설치하고 doxygen docs/doxygen/Doxyfile
실행하세요. doxygen 문서는 이제 docs/doxygen/output/html/index.html
에서 찾을 수 있습니다.
Doxygen 설치 지침은 Doxygen 웹페이지에서 확인할 수 있습니다.
배포판과 플랫폼은 두 가지 계층으로 나열되어 있습니다. 계층 1 플랫폼은 CI에서 테스트를 구축, 실행 및 통과하도록 보장됩니다. 계층 2 플랫폼은 구축이 보장되며 이에 대해 공개된 문제를 해결할 것이지만 현재 CI에서 실행되지 않으며 모든 커밋에서 적극적으로 검토되지 않습니다. 아래에 나열되지 않은 플랫폼을 사용하고 있으며 해당 플랫폼을 CI에 추가하도록 요청(또는 도움!)하고 싶다면 토론을 위해 문제를 열어주세요.
CI에 배포 | 플랫폼 |
---|---|
우분투18, 우분투24** | x86_64 |
우분투22 | x86_64, i686 |
AL2, AL2023** | x86_64, aarch64 |
닉스OS | x86_64, aarch64 |
오픈BSD 7.4 | x86_64 |
FreeBSD 최신 | x86_64 |
OSX 최신 | 아치64 |
**작업 진행 중
CI에 없는 배포 | 플랫폼 |
---|---|
페도라 코어 34-36 | x86_64, aarch64 |
우분투14/16/20 | x86_64, aarch64 |
우분투18/22/24 | 아치64 |
OSX 12-14 | x86_64 |
이러한 배포 목록은 완전하지 않으며 도구가 누락되거나 지원되는 libcrypto 라이브러리가 누락되어 성공적인 빌드를 방해할 수 있습니다.
s2n-tls I/O API는 널리 사용되는 POSIX I/O API에 익숙한 개발자가 직관적으로 사용할 수 있도록 설계되었으며 s2n-tls는 차단, 비차단 및 전이중 I/O를 지원합니다. 또한 s2n-tls에는 잠금이나 뮤텍스가 없습니다.
/* Create a server mode connection handle */
struct s2n_connection * conn = s2n_connection_new ( S2N_SERVER );
if ( conn == NULL ) {
... error ...
}
/* Associate a connection with a file descriptor */
if ( s2n_connection_set_fd ( conn , fd ) < 0 ) {
... error ...
}
/* Negotiate the TLS handshake */
s2n_blocked_status blocked ;
if ( s2n_negotiate ( conn , & blocked ) < 0 ) {
... error ...
}
/* Write data to the connection */
int bytes_written ;
bytes_written = s2n_send ( conn , "Hello World" , sizeof ( "Hello World" ), & blocked );
s2n-tls 라이브러리 구축 및 개발 중인 애플리케이션에서 s2n-tls를 사용하는 방법에 대한 자세한 내용은 사용 가이드를 참조하세요.
s2n-tls는 SSLv3, TLS1.0, TLS1.1, TLS1.2 및 TLS1.3을 구현합니다. 암호화의 경우 s2n-tls는 CBC 및 GCM 모드, ChaCha20, 3DES 및 RC4에서 128비트 및 256비트 AES를 지원합니다. 순방향 보안을 위해 s2n-tls는 DHE와 ECDHE를 모두 지원합니다. s2n-tls는 SNI(Server Name Indicator), ALPN(Application-Layer Protocol Negotiation) 및 OCSP(Online Certificate Status Protocol) TLS 확장도 지원합니다. SSLv3, RC4, 3DES 및 DHE는 보안상의 이유로 기본적으로 비활성화되어 있습니다.
어떤 암호화 알고리즘과 프로토콜을 사용하는 것이 가장 좋은지 추적하기 어려울 수 있으므로 s2n-tls는 최신 "기본" 기본 설정 세트를 사용하는 간단한 API를 제공합니다. 이전 버전과의 호환성을 위해 특정 버전을 유지하려는 경우에도 지원됩니다.
/* Use the latest s2n-tls "default" set of ciphersuite and protocol preferences */
s2n_config_set_cipher_preferences ( config , "default" );
/* Use a specific set of preferences, update when you're ready */
s2n_config_set_cipher_preferences ( config , "20150306" )
내부적으로 s2n-tls는 데이터 보호에 대한 체계적인 접근 방식을 취하고 안전성을 향상시키기 위해 설계된 여러 메커니즘을 포함합니다.
s2n-tls의 코드는 검토 가능성에 중점을 두고 구조화되고 작성되었습니다. 모든 s2n-tls 코드는 코드 검토 대상이며, 매년 s2n-tls의 보안 평가를 완료할 계획입니다.
현재까지 상용 보안 공급업체의 검토를 포함하여 s2n-tls에 대한 외부 코드 수준 검토가 두 번 있었습니다. s2n-tls는 또한 광범위한 암호화, 보안 및 오픈 소스 커뮤니티의 신뢰할 수 있는 일부 구성원과 공유되었습니다. 발견된 모든 문제는 항상 s2n-tls 문제 추적기에 기록됩니다.
코드 검토 외에도 s2n-tls에는 정기적인 정적 분석, 퍼즈 테스트 및 침투 테스트가 적용됩니다. 상용 벤더에 의한 두 번의 침투 테스트를 포함하여 여러 가지 침투 테스트가 진행되었습니다.
s2n-tls에는 긍정 및 부정 단위 테스트와 엔드투엔드 테스트 사례가 포함되어 있습니다.
단위 테스트 범위는 여기에서 볼 수 있습니다. 이는 특정 빌드에 대한 단위 적용 범위를 나타냅니다. 해당 빌드가 반드시 모든 s2n-tls 기능을 지원하는 것은 아니므로 테스트 범위가 인위적으로 낮아질 수 있습니다.
s2n-tls는 가능한 한 빨리 일반 텍스트 데이터를 암호화하거나 삭제합니다. 예를 들어, 해독된 데이터 버퍼는 애플리케이션에서 읽을 때 지워집니다.
s2n-tls는 운영 체제 기능을 사용하여 데이터가 디스크로 교체되거나 코어 덤프에 나타나지 않도록 보호합니다.
s2n-tls는 거의 사용되지 않는 옵션 및 확장은 물론 프로토콜 수준 취약점을 유발한 이력이 있는 기능의 구현을 방지합니다. 예를 들어 DTLS는 지원되지 않습니다.
TLS 및 관련 암호화 알고리즘의 보안은 안전한 난수 생성에 따라 달라집니다. s2n-tls는 모든 스레드에 두 개의 별도 난수 생성기를 제공합니다. 하나는 투명하게 나타날 수 있는 무작위로 생성된 "공개" 데이터용이고, 다른 하나는 비밀로 유지되어야 하는 "비공개" 데이터용입니다. 이 접근 방식은 컨텍스트 전반에 걸쳐 정보 유출로 인해 난수 생성 알고리즘의 잠재적인 예측 가능성 약점이 발생할 위험을 줄입니다.
s2n-tls는 다양한 암호화 라이브러리를 사용할 수 있도록 구성되었습니다. 현재 s2n-tls는 AWS-LC, OpenSSL(버전 1.0.2, 1.1.1 및 3.0.x), LibreSSL 및 BoringSSL을 지원하여 기본 암호화 작업을 수행합니다. libcrypto 관련 기능 목록은 libcrypto 빌드 문서를 확인하세요.
s2n-tls에는 민감한 데이터가 유출될 수 있는 시간 기반 부채널을 차단하기 위한 구조화된 지원이 포함되어 있습니다. 예를 들어, s2n-tls가 TLS 레코드 또는 핸드셰이크 메시지를 구문 분석하지 못하는 경우 s2n-tls는 응답하기 전에 나노초 단위로 세분화되어 10~30초 사이의 무작위 지연을 추가합니다. 이로 인해 실제 타이밍 부채널 공격의 복잡성이 최소 수십조 배 증가합니다.
s2n-tls는 간단한 테이블을 사용하여 TLS/SSL 상태 시스템을 구동하므로 잘못된 순서가 아닌 상태가 발생하는 것을 방지합니다.
s2n-tls는 C로 작성되었지만 표준 C 라이브러리 기능을 가볍게 사용하고 체계적인 경계 적용 검사에서 모든 메모리 처리, 문자열 처리 및 직렬화를 래핑합니다.
s2n-tls에서 잠재적인 보안 문제를 발견한 경우 취약성 보고 페이지를 통해 AWS 보안팀에 알려 주시기 바랍니다. 공개 Github 문제를 생성 하지 마세요.
s2n-tls를 패키징 또는 배포하거나 대규모 다중 사용자 서비스의 일부로 s2n-tls를 사용하는 경우 향후 s2n-tls 릴리스에 대한 사전 알림을 받을 수 있습니다. [email protected]으로 문의하세요.
s2n-tls에 기여하는 데 관심이 있으시면 개발 가이드를 참조하세요.
우리가 알고 있는 s2n-tls에 대한 언어 바인딩 목록을 참조하세요.