728x90

이번 글에서는 디지털 인증서와 SSL/TLS 기초에 대해 알아보겠습니다.

 

인증서(Certificate)

인증서(Certificate)는 자신이 인증된 존재라는 것을 증명하기 위한 장치입니다.

서버의 존재 증명을 위해 사용하거나 암호화 통신을 위한 기초 정보로 사용합니다.

인증서에는 인증서의 발행자, 발행을 받은 사람, 유효기한의 정보가 담겨 있습니다.

브라우저 상단에 자물쇠 모양을 클릭해 쉽게 확인해 볼 수 있습니다.

 

인증서는 CA라고 불리는 인증기관(Certificate Authority)이 발행합니다.

인증기관은 PKI(Public Key Infrastructure, 공개키 기반 구조) 정책을 이용하고

국가가 운용하는 경우 GPKI(GovernmentPKI)라고 부르는 경우가 있습니다.

- PKI는 디지털 인증의 생성, 관리, 배포, 사용, 저장, 파기와 공개키 암호화의 관리에 쓰이는

일련의 역할, 정책, 하드웨어, 소프트웨어, 절차의 총칭을 말합니다.

 

인증기관은 크게 루트 인증기관(Root CA)과 중간 인증기관으로 나누어집니다.

 

루트인증기관

인증기관의 최상위 인증기관으로 루트인증기관의 정당성은 자기 스스로 보증합니다.

스스로 루트 인증서를 발행하고 보통 루트 인증서는 OS나 브라우저와 함께 배포됩니다.

 

중간인증기관

루트 인증기관으로부터 위임을 받은 인증기관입니다. 루트 인증기관의 신뢰를 받음으로써 자신을 보증합니다.

중간 인증서는 보통 서버, 클라이언트 모델에서 서버를 운용하는 측이 서버 인증서와 함께 서버에 저장하여 사용합니다.

또한 중간 인증기관이 발행한 서버 인증서와 같은 인증서가 올바른지를 확인하는 근거가 되는 인증서이며

중간 인증서 자체는 상위 인증기관이 발행합니다.

 

인증서 발행 과정

1. 루트 인증기관이 스스로를 보증하는 루트 인증서를 발행합니다.

- 루트 인증서에는 루트 인증기관의 공개키가 포함되어 있으며 보통 OS나 브라우저와 함께 배포됩니다.

2. 중간 인증기관은 루트 인증기관 또는 상위 인증기관에 CSR(Certificate Signing Request)을 보냅니다.

- CSR에는 중간인증기관의 인증정보와 생성한 공개키를 첨부해 보냅니다.

- 루트 인증기관이 CSR을 확인하고 검증된 경우 루트 인증기관의 비밀키로 서명된 중간 인증서를 발행합니다.

- 중간 인증서에는 중간 인증기관의 공개키가 포함되어 있습니다.

 

인증서 검증 과정

1. 클라이언트가 웹 서버에 인증서의 제시를 요구합니다.

2. 웹 서버는 서버에 저장된 중간 인증서와 서버 인증서를 클라이언트에게 응답으로 보냅니다.

3. 클라이언트는 웹 서버가 전달한 중간 인증서에서 중간 인증기관의 공개키를 추출합니다.

4. 추출한 중간 인증기관의 공개키를 이용해 서버 인증서를 검증합니다.

5. 서버 인증서의 유효성이 검증되면 루트 인증서에서 루트 인증기관의 공개키를 추출합니다.

6. 루트 인증서의 공개키를 이용해 중간 인증서를 검증합니다.

7. 중간 인증서의 유효성이 검증되는 것으로 마무리됩니다.

 

SSL/TLS

SSL/TLS는 인터넷 통신을 위한 인증 및 통신 암호화 장치입니다.

 

SSL(Secure Socket Layer)

SSL은 넷스케이프사에서 만든 인터넷 통신 암호화 장치입니다.

버전 1,2,3이 개발되었으나 보안상 취약성이 발견되어 더 이상 사용되지 않고 있습니다.

더이상 사용되지 않지만 SSL/TLS를 SSL이라고 그냥 표현하는 경우가 많습니다.

 

TLS(Transport Layer Security)

TLS는 SSL 이후 SSL의 취약성을 보완하여 등장한 인터넷 통신 암호화 장치입니다.

SSL과는 다르게 TLS 핸드세이크라는 과정을 통하여 서로 인증서를 검증하는 단계를 포함하고 있습니다.

핸드세이크 과정은 크게 세 단계로 이루어집니다.

  1. 서로가 어떤 TLS 버전을 사용 가능한지 확인

  2. 인증서를 사용해 서로 신뢰할 수 있는지 확인

  3. 서로 간의 통신에 사용할 암호교환

 

TLS 핸드세이크

1. 클라이언트가 서버 측에 클라이언트 헬로 요청을 보냅니다.

- 해당 요청에는 클라이언트가 지원하는 TLS 버전, 암호 방식, 클라이언트가 생성한 무작위 바이트 문자열을 포함합니다.

2. 서버가 클라이언트에 서버 헬로로 응답합니다.

- 해당 응답에는 클라이언트가 지원하는 암호 방식 중 서버가 선택한 암호 방식, 서버 인증서, 서버가 생성한 무작위 

바이트 문자열을 포함해 응답합니다.

3. 클라이언트가 서버가 제시한 인증서를 검증합니다.

4. 인증서의 유효성이 검증되면 클라이언트가 서버에 예비 마스터 암호를 생성해 전달합니다.

- 예비 마스터 암호는 클라이언트가 새로 생성한 무작위 바이트 문자열을 서버가 보낸 인증서에서 공개키를 추출해, 해당 공개키로 암호화한 암호입니다.

5. 서버 측에서 예비 마스터 암호를 개인키로 복호화합니다.

6. 세션키를 생성합니다.

- 클라이언트가 보낸 무작위 바이트 문자열, 서버가 보낸 무작위 바이트 문자열, 예비 마스터 암호 세 가지를 이용합니다.

- 서버가 선택한 암호 방식과 세 가지 무작위 바이트 문자열을 가지고 세션키를 생성합니다.

7. 세션키로 암호화된 완료 메세지를 주고받습니다.

8. 세션키 검증이 완료되면 암호화 통신을 시작합니다.

 

 

참조

[보안의 기본] Miyamoto Kunio, Okubo Takao 지음, 이영란 옮김, 위즈플래닛

공개키 기반 구조(PKI)

 

공개 키 기반 구조(PKI)

PKI(Public Key Infrastructure)는 트랜잭션에 관련된 당사자들을 인증하기 위해 공개 키 암호화의 사용을 지원하는 기능, 정책 및 서비스의 시스템입니다. PKI(Public Key Infrastructure)의 컴포넌트를 정의하

www.ibm.com

SSL 취약점

v2 DROWN(Decrypting RSA with Obsolete and Weakened eNcryption)

v3 POODLE(Padding Oracle On Downgraded Legacy Encryption)

728x90

'네트워크' 카테고리의 다른 글

SSH  (0) 2022.11.21
728x90

HTTP Request를 던지면 Response 헤더에 서버 정보가 따라오는데요.

보안 점검 사항에서 불필요한 서버 정보를 노출하지 말라고 하여 수정할 필요성이 있었습니다.

 

서버 정보를 지우기 위해 찾아본 내용으로 크게 두 방법이 있었습니다.

1. URL Rewrite 2.0

2. web.config 수정

 

1번은 IIS에서 응답하는 헤더를 재작성해 전달하는 방식으로 수정합니다.

예를 들어 서버 헤더가 기존에 IIS 10.0으로 응답했다면 서버 헤더로 나가는 값을

전부 *이나 ''처럼 빈값으로 변경해 응답하는 방식입니다.

 

2번은 web.config의 웹서버 보안 부분에 필터링을 넣어 아예 서버 헤더가 응답되지 않습니다.

저는 IIS 10.0을 사용 중이며 해당 방법을 사용했습니다.

그런데 IIS 8.5 버전을 사용하는 경우 에러가 발생할 수 있다니 확인이 필요할 것 같습니다.

아래는 2번 방법의 링크입니다.

https://serverfault.com/questions/991045/remove-modify-iis-10-server-header-which-discloses-iis-version

 

 

728x90

'C#' 카테고리의 다른 글

[.NET] SmtpClient  (0) 2022.12.02
[.NET] MailMessage  (0) 2022.12.01
[.NET] System.Data.DataTable/DataRow/DataColumn  (0) 2022.11.30
[.NET] FormsAuthentication 폼 인증 설정  (0) 2022.11.30
[ASP.NET] View 단에 데이터 전달하기  (0) 2022.11.27
728x90

SmtpClient Class

  • 애플리케이션에서 SMTP를 사용하여 이메일을 보낼 수 있도록 합니다.
  • 하지만 많은 최신 프로토콜들이 SmtpClient를 지원하지 않으므로 새 개발에는 대신 MailKit 또는 다른 라이브러리를 사용하는 것이 좋습니다.
  • 사용하기 위해서는 아래의 속성을 지정해야 합니다.
    • Host: SMTP 호스트 서버
    • Credentials:인증서 -> 필요한 경우에만 설정
    • 보내는 사람
    • 받는 사람
    • 메세지 내용
public static void Main(string[] args)
    {
        // SmtpClient 인스턴스를 생성합니다.
        SmtpClient client = new SmtpClient(args[0]);
        // 보내는 사람의 메일 주소를 생성합니다.
        MailAddress from = new MailAddress("jane@contoso.com",
            "Jane " + (char)0xD8+ " Clayton",
        System.Text.Encoding.UTF8);
        // 받는 사람의 메일 주소를 생성합니다.
        MailAddress to = new MailAddress("ben@contoso.com");
        // 메일 메시지를 생성합니다.
        MailMessage message = new MailMessage(from, to);
        message.Body = "This is a test email message sent by an application. ";

        client.Send(message);

        message.Dispose();

    }

Ref

  • MailKit
    • https://github.com/jstedfast/MailKit
728x90

'C#' 카테고리의 다른 글

IIS Server Header 제거하기  (0) 2023.05.12
[.NET] MailMessage  (0) 2022.12.01
[.NET] System.Data.DataTable/DataRow/DataColumn  (0) 2022.11.30
[.NET] FormsAuthentication 폼 인증 설정  (0) 2022.11.30
[ASP.NET] View 단에 데이터 전달하기  (0) 2022.11.27
728x90

MailMessage Class

  • SmtpClient 클래스를 사용하여 보낼 수 있는 이메일 메시지를 나타냅니다.
  • MailMessage 인스턴스는 SmtpClient를 사용하여 SMTP 서버로 전송되는 메일 메시지를 생성하는데 사용됩니다.
  • 메일의 보낸 사람, 받는 사람, 제목 및 본문을 초기화, 설정할 수 있습니다.
  • 속성
속성                    설명
Attachments             첨부파일
Bcc                     숨은 참조
CC                      참조
BodyEncoding            콘텐츠 형식
HeadersEncoding         사용자 지정 헤더 인코딩
Body                    메시지 본문
Priority                우선 순위
To                      받는 사람
ReplyToList             메일의 회신 주소 목록
From                    보낸 사람
Subject                 주제 
... 
  • 생성자

    • MailMessage()
    • MailMessage(MailAddress, MailAddress)
    • MailMessage(String from, String to)
    • MailMessage(String from, String to, String? subject, String? body)
  • 예시

public static void CreateMessageWithAttachment(string server)
{
    // 현재 디렉토리에 있는 data.xls 첨부파일
    string file = "data.xls";
    // 생성자로 보낸 사람, 받는 사람, 제목, 메시지 설정
    MailMessage message = new MailMessage(
        "jane@contoso.com",
        "ben@contoso.com",
        "Quarterly data report.",
        "See the attached spreadsheet.");

    // 첨부 파일 생성.
    Attachment data = new Attachment(file, MediaTypeNames.Application.Octet);
    // 해당 파일의 타임스탬프 생성.
    ContentDisposition disposition = data.ContentDisposition;
    disposition.CreationDate = System.IO.File.GetCreationTime(file);
    disposition.ModificationDate = System.IO.File.GetLastWriteTime(file);
    disposition.ReadDate = System.IO.File.GetLastAccessTime(file);
    // 파일 메시지에 첨부파일 추가.
    message.Attachments.Add(data);

    SmtpClient client = new SmtpClient(server);
    // 인증서 필요하면 인증서 추가.
    client.Credentials = CredentialCache.DefaultNetworkCredentials;

    try
    {
        // 메일 전송
        client.Send(message);
    }
    catch (Exception ex)
    {
        Console.WriteLine("Exception caught in CreateMessageWithAttachment(): {0}",
            ex.ToString());
    }

    data.Dispose();
}
728x90

'C#' 카테고리의 다른 글

IIS Server Header 제거하기  (0) 2023.05.12
[.NET] SmtpClient  (0) 2022.12.02
[.NET] System.Data.DataTable/DataRow/DataColumn  (0) 2022.11.30
[.NET] FormsAuthentication 폼 인증 설정  (0) 2022.11.30
[ASP.NET] View 단에 데이터 전달하기  (0) 2022.11.27
728x90

System.Data.DataTable

  • 메모리 내 데이터의 한 테이블을 나타냅니다.
  • 생성자
    • DataTable()
    • DataTable(SerializationInfo, Streaming Context)
    • DataTable(String)
    • DataTable(String, String)
  • DataTable(String)
    • 지정된 테이블 이름을 사용하여 새 인스턴스를 초기화합니다.
    • 개체에 액세스할 때는 조건부로 대/소문자를 구분합니다.
    • DataTable 이름이 'mydatatable'과 'Mydatatable'이 존재하는 경우에는 테이블 중 하나를 검색하는데 문자열 대/소문자를 구분합니다.
    • 하지만 'Mydatatable' 하나만 존재할 경우 문자열 대/소문자를 구분하지 않습니다.
  • Ref
    • https://learn.microsoft.com/ko-kr/dotnet/api/system.data.datatable?view=net-7.0

System.Data.DataColumn

  • DataTable에 있는 열의 스키마를 나타냅니다.

    private void MakeTable()
    {
      // Create a DataTable.
      // Product라는 이름의 테이블 생성
      DataTable table = new DataTable("Product");
    
      // Create a DataColumn and set various properties.
      DataColumn column = new DataColumn();
      // 열의 데이터 타입 설정
      column.DataType = System.Type.GetType("System.Decimal");
      // 해당 열에 Null값이 허용되는지 여부 True:허용, False:불가 기본값 True
      column.AllowDBNull = false;
      column.Caption = "Price";
      column.ColumnName = "Price";
      // 기본값 설정
      column.DefaultValue = 25;
    
      // Add the column to the table.
      table.Columns.Add(column);
    
      // Add 10 rows and set values.
      DataRow row;
      for(int i = 0; i < 10; i++)
      {
          row = table.NewRow();
          row["Price"] = i + 1;
    
          // Be sure to add the new row to the
          // DataRowCollection.
          table.Rows.Add(row);
      }
    }
  • Ref

    • https://learn.microsoft.com/ko-kr/dotnet/api/system.data.datacolumn?view=net-7.0

System.Data.DataRow

  • DataTable의 데이터 행을 나타냅니다.

    private void CreateNewDataRow()
    {
      // Use the MakeTable function below to create a new table.
      // MakeNamesTable은 id,fname,lname의 열을 가진 table을 생성
      DataTable table;
      table = MakeNamesTable();
    
      // Once a table has been created, use the
      // NewRow to create a DataRow.
      DataRow row;
      row = table.NewRow();
    
      // Then add the new row to the collection.
      row["fName"] = "John";
      row["lName"] = "Smith";
      table.Rows.Add(row);
    }
  • Ref

    • https://learn.microsoft.com/ko-kr/dotnet/api/system.data.datarow?view=net-7.0
728x90

'C#' 카테고리의 다른 글

IIS Server Header 제거하기  (0) 2023.05.12
[.NET] SmtpClient  (0) 2022.12.02
[.NET] MailMessage  (0) 2022.12.01
[.NET] FormsAuthentication 폼 인증 설정  (0) 2022.11.30
[ASP.NET] View 단에 데이터 전달하기  (0) 2022.11.27
728x90

web.config 파일의 보안 설정 구성

FormsAuthentication 방식

<authentication mode="Forms">
    <forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx"
        protection="All" path="/" timeout="30" />
</authentication>
  • 인증된 사용자의 자격 증명을 쿠키 또는 URL에서 관리
  • authentication<location path="">로 감싸면 path에 설정된 디렉토리에 한정된 권한 설정
  • loginUrl
    • 등록한 주소를 통해 사용자 인증을 진행
    • 인증 만료시 해당 로케이션으로 리디렉션 됨
  • defaultUrl
    • 요청에 반환 URL이 포함되지 않은 경우 해당 경로로 이동
  • timeout
    • 인증 티켓의 만료 시간
  • slidingExpiration 상대 만료를 사용하는지 여부
    • 인증 만료 시간이 경과하다 요청이 들어오면 인증 만료 시간을 재설정

FormsAuthentication Class

Method

  • SetAuthCookie(String, Boolean)
    • 사용자 이름에 대한 인증 티켓을 만들어 응답의 쿠키나 URL에 추가
    • Boolean 브라우저 세션 전체에 저장되는 영구 쿠키를 만들려면 True
  • SignOut()
    • 브라우저에서 폼 인증 티켓 제거

ref

  • https://learn.microsoft.com/ko-kr/dotnet/api/system.web.security.formsauthentication?view=netframework-4.8
728x90

'C#' 카테고리의 다른 글

IIS Server Header 제거하기  (0) 2023.05.12
[.NET] SmtpClient  (0) 2022.12.02
[.NET] MailMessage  (0) 2022.12.01
[.NET] System.Data.DataTable/DataRow/DataColumn  (0) 2022.11.30
[ASP.NET] View 단에 데이터 전달하기  (0) 2022.11.27
728x90

View에 데이터 전달하기

  1. viewModel
  2. viewData
  3. viewBag

ViewModel

  • view에 model의 형식을 지정한다.
  • controller에서 view에 model의 인스턴스를 전달한다.
  • viewModel을 사용시 컴파일 때 인스턴스 형식의 유효성 검사를 진행한다.
  • 사용법
// @model로 사용할 모델을 지정한다. 
@model WebApplication1.ViewModels.Address

<h2>Contact</h2>
<address>
    @Model.Street<br />
    @Model.City, @Model.State @Model.PostalCode<br />
    <abbr title="Phone">P:</abbr> 425.555.0100
</address>
public IActionResult Contact()
{
    ViewData["Message"] = "Your contact page.";

    var viewModel = new Address()
    {
        Name = "Microsoft",
        Street = "One Microsoft Way",
        City = "Redmond",
        State = "WA",
        PostalCode = "98052-6399"
    };

    return View(viewModel);
}

ViewData

  • string 키를 통해 액세스되는 ViewDataDictionary 개체입니다.
  • string을 제외하고 다른 개체 값을 추출할 때는 캐스트가 필요합니다.
  • 런타임에 동적으로 확인됩니다.
  • [viewData]라는 특성의 ViewDataAttribute를 사용할 수 있습니다.
@{ // Since Address isn't a string, it requires a cast. 
var address = ViewData["Address"] as Address; 
} 
@ViewData["Greeting"] World!

<address>
    @address.Name<br />
    @address.Street<br />
    @address.City, @address.State @address.PostalCode
</address>
public IActionResult SomeAction()
{
    ViewData["Greeting"] = "Hello";
    ViewData["Address"]  = new Address()
    {
        Name = "Steve",
        Street = "123 Main St",
        City = "Hudson",
        State = "OH",
        PostalCode = "44236"
    };

    return View();
}

ViewBag

  • ViewBag은 ViewData에 저장된 개체에 대한 동적 액세스를 제공
  • 캐스팅이 필요하지 않다.
@ViewBag.Greeting World!

<address>
    @ViewBag.Address.Name<br />
    @ViewBag.Address.Street<br />
    @ViewBag.Address.City, @ViewBag.Address.State @ViewBag.Address.PostalCode
</address>
public IActionResult SomeAction()
{
    ViewBag.Greeting = "Hello";
    ViewBag.Address  = new Address()
    {
        Name = "Steve",
        Street = "123 Main St",
        City = "Hudson",
        State = "OH",
        PostalCode = "44236"
    };

    return View();
}
  • ViewData와 ViewBag은 동일한 ViewData 컬렉션을 사용하므로 두 객체의 값을 읽고 쓸 때 혼합하여 사용할 수 있습니다.
@{ ViewBag.Title = "About Contoso"; // ViewBag 형식 }

<!DOCTYPE html>
<html lang="en">
    <head>
        // ViewData 형식
        <title>@ViewData["Title"]</title>
    </head>
</html>

ViewData와 ViewBag의 차이점

  • ViewData
    • 사전의 키는 문자열이므로 공백을 사용할 수 있습니다.
    • -> ViewData["Some Key With Whitespace"]
    • string 이외의 모든 형식을 캐스트 해야합니다.
  • ViewBag
    • 점 표기법을 사용하며 캐스팅이 필요하지 않습니다.
    • 간단하게 Null값을 확인할 수 있습니다.
    • -> @ViewBag.Person?.Name
728x90

'C#' 카테고리의 다른 글

IIS Server Header 제거하기  (0) 2023.05.12
[.NET] SmtpClient  (0) 2022.12.02
[.NET] MailMessage  (0) 2022.12.01
[.NET] System.Data.DataTable/DataRow/DataColumn  (0) 2022.11.30
[.NET] FormsAuthentication 폼 인증 설정  (0) 2022.11.30
728x90

제 리눅스 환경과 원격 서버의 환경은 아래와 같습니다.

Ubuntu 20.04 LTS

 

만들고자 하는 계정과 배경은 이렇습니다.

  • @와 .이 들어간 이메일 형식의 사용자 계정을 추가하고 싶습니다.
  • 원격 Git Server가 존재하고 로컬에서 SSH로 Repository를 관리하고 싶습니다.

 

사용자 계정추가

먼저 linux에서 사용자 계정을 만드는 명령어는 adduser와 useradd가 있습니다.

여기서는 adduser로 설명을 하겠습니다.

 

$ sudo adduser <사용자id>
$ sudo adduser userId@admin.com

두 번째처럼 계정을 설정할 경우 오류 메시지를 내뿜으면서 계정이 생성되지 않습니다.

기본적으로 특수문자를 계정으로 설정할 수 없기 때문입니다.

하지만 무시하고 특수문자를 계정의 id에 추가하고 싶으면 --force -badname 옵션을 사용하세요.

$ sudo adduser userId@admin.com --force -badname

이후에 비밀번호를 설정하고 다른 내용을 채워주시면 사용자 계정이 생성됩니다.

 

SSH 설정

* SSH를 사용 가능한 상태를 전제로 합니다. ex) openssh 설치*

 

ssh 설정은 서버와 로컬에서 각각 해주실 것이 있습니다.

우선 로컬에서 ssh 공개키를 생성해야 합니다.

기본적으로는 ~/.shh 경로에 키가 존재합니다.

$ cd ~/.ssh 
$ ls
authorized_keys2  id_dsa       known_hosts
config            id_dsa.pub

.ssh 디렉토리로 이동해 ls 명령어로 id_dsa.pub이 있는지 확인합니다.

id_dsa.pub가 공개키고 id_dsa는 개인키입니다.

만약 공개키가 없다면 ssh-keygen 명령어로 생성해주세요.

$ ssh-keygen

그러면 키를 저장하고 싶은 디렉토리를 입력하고 암호를 두 번 입력하면 생성할 수 있습니다.

이때 암호를 비워두면 키를 사용할 때 암호를 묻지 않습니다.

암호를 생성하면 암호는 아래처럼 생겼습니다.

$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSU
GPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3
Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XA
t3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/En
mZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx
NrRFi9wrf+M7Q== schacon@mylaptop.local

그럼 이제 이 파일을 옮기거나 내용을 복사해 서버에 만들어둔 계정의 .ssh/authorized_keys에 등록하면 됩니다.

 

서버에서는 제일 먼저 생성했던 계정으로 사용자 변경해줍니다.

$ su userId@admin.com
$ cd ~
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys

사용자 계정을 userId@admin.com로 지었으니 su 명령어를 사용해 사용자를 변경해주고

홈 디렉토리로 이동 후 .ssh 디렉토리 생성, 권한 변경.

authorized_keys 파일 생성, 권한 변경을 해줍니다.

 

이후 authorized_keys 파일에 위에 로컬에서 생성한 공개키를 추가해주시면 됩니다.

파일로 가져오셨다면 cat, 복사해오셨다면 echo를 사용해주세요. 

사실 다른 방법도 될 수 있는데 전 echo를 사용했습니다.

$ echo "공개키"  >> ~/.ssh/authorized_keys

다음부터는 생성한 계정을 통해 접속하시면 됩니다.

 

#ex)
$ ssh userId@admin.com@192.168.xxx.xxx:9999

저는 Repository를 관리한다고 했으니 서버에 생성한 계정 소유자 권한을

서버에 접속은 못하고 push, pull만 가능하게 하려면 git-shell를 사용해보세요.

 

참조

Git server 설정하기

 

Git - 서버 설정하기

ssh-copy-id 명령을 사용하면 여기에서 설명하는 SSH 공개키를 복사하고 설치하는 내용을 자동화 한 도구이다.

git-scm.com

새 사용자 계정추가 aws linux

728x90

'OS' 카테고리의 다른 글

Linux Shell 명령어 - scp, cp, cat, su, chmod  (0) 2022.11.21
728x90

오늘 로컬에서 원격 저장소로 파일을 하나 옮기려고 하는데 scp permission denied오류 때문에

리눅스 쉘에 명령어를 바꿔가며 수십 번 처보고, 구글에 검색도 해보고 얻은 결과입니다.

 

문제가 저와 다를 수 있지만 대부분 비슷한 답을 주니 먼저 시도해보고 다른 방법을 찾는 것도 좋으실 듯합니다.

 

일단 제 코드는 아래와 비슷합니다.

$ scp -P 9900 README.md user@192.168.xxx.xxx:/home/user/repo

해당하는 주소 home/user/repo에 9900번 포트를 이용해 README.md 파일을 옮기고 싶었으나

scp permission denied 오류가 발생했습니다.

 

해당 오류를 검색해보시면 크게 세 가지 방법을 찾으실 수 있는데요.

1. 옮기려는 파일의 권한이 잘 주어졌는지 확인해보세요. 

2. 원격 저장소의 포트 번호나 경로가 맞는지 확인해보세요.

3. 원격 저장소의 폴더 권한을 확인해보세요.

 

먼저 첫 번째 문제는 하위 디렉토리로 이동해서 ls -al 명령어를 치면 아래와 같은 결과를 얻을 수 있습니다.

그걸 보고 읽기, 쓰기 권한이 있는지 확인해보세요.

빨간색 부분이 권한이 있는지 없는지 나와있는 부분입니다. r은 읽기 w는 쓰기 x는 실행

저처럼 되어 있다면 문제없습니다.

 

두 번째의 포트번호는 원격 저장소에 설정하신 설정을 찾으셔야 하니 패스하고

경로 같은 경우는 상대 경로로 작성하면 된다는 이야기를 여러 스택오버플로우 페이지에서 볼 수 있었습니다.

$ scp -P 9900 README.md user@192.168.xxx.xxx:/home/user/repo

예를 들어 위와 같은 주소가 원격 저장소의 주소이고, /home/user가 홈 디렉토리인 경우에는 아래처럼 작성할 수 있습니다.

$ scp -P 9900 README.md user@192.168.xxx.xxx:~/repo

 

세 번째 문제는 로컬에서 원격 저장소에 파일을 보낼 때 원격 저장소의 디렉토리가 root 권한으로 설정되어있을 경우

해당 오류가 발생할 수 있습니다.

ls -al 명령어를 쳤을 때 파일을 받아오려는 원격 저장소의 디렉토리의 권한이 위와 같이 root로 되어있다면

권한을 변경하고 다시 시도해보세요.

$ sudo chown <사용자 계정> <디렉토리명>
$ sudo chown ymkim repo.git

위의 명령어로 사용자 계정으로 권한을 바꿀 수 있습니다.

예를 들어 두 번째 명령어는 repo.git 폴더를 ymkim계정 권한으로 바꾸는 것입니다.

 

여담으로 위의 방법들이 안되시면 ssh 서비스가 켜져 있는지 확인해보세요.

$ service ssh status

혹은 Scp permission denied (publickey)의 문제이면 원격 저장소에 ssh 공개키 등록을 해주셔야 합니다.

728x90
728x90

 

scp

- Secure Copy의 줄임말입니다.

- SSH 통신을 이용해 네트워크로 연결된 호스트 간에 파일을 주고받는 명령어입니다.

- 원격 저장소에 있는 파일과 디렉토리를 보내거나 가져올 수 있습니다.

원격 저장소에서 폴더 받아오기
$ scp git@192.168.000.000:/myrepo.git /home/repos
$ scp 옵션 [저장소아이디]@[저장소주소]:[폴더위치] [저장위치]

로컬에서 원격 저장소로 파일보내기
$ scp test.txt git@192.168.000.000:/myrepo.git
$ scp [옵션] [파일 또는 디렉토리] [저장소아이디]@[저장소주소]:[저장위치]

 

 

cp

- copy 명령어입니다.

- 파일 또는 디렉토리를 복사하는데 이용합니다.

$ cp test.text test2.txt
test 파일을 복사하여 test2 파일을 생성합니다.

 

cat

- 파일의 내용을 텍스트로 출력합니다.

$ cat /home/user/test.txt

home/user 경로 안에 있는 test 파일을 읽어 쉘에 보여줍니다.

사용방법은 훨씬 많지만 저는 파일을 읽어 안의 내용을 확인할 때만 사용하고 있습니다.

 

su

- Substitute User의 줄임말입니다.

- 다른 계정으로 전환하는 명령어입니다.

$ su git
$ su otheruser

계정에 비밀번호를 만들어 뒀을 경우 명령어를 사용하면 비밀번호를 입력하라고 나옵니다.

계정 생성은 useradd 명령어 혹은 adduser를 사용하면 됩니다.

개인적으로는 adduser가 편한 것 같습니다.

 

chmod

- Change Mode의 줄임말입니다.

- 파일의 사용 권한을 변경할 때 사용합니다.

$ chmod [option] [mode] [file]

- 읽고, 쓰고, 실행하는 것에 대한 권한을 지정할 수 있습니다.

- 이는 rwx와 8진수 형식으로 지정할 수 있습니다.

$ chmod 700 .ssh
$ chmod 600 .ssh/authorized_keys

 

728x90

'OS' 카테고리의 다른 글

Linux(Ubuntu) adduser 사용자 계정 추가와 SSH 설정  (0) 2022.11.22

+ Recent posts