Uzantılarla Gemini CLI ile Kod İnceleme ve Güvenlik Analizi

1. 📖 Giriş

194a7f6f1a93b614.png

Bu codelab'de Gemini KSA'nın temellerini öğrenecek ve yazılım geliştirme iş akışınızda kod inceleme ve güvenlik analizi uzantısını kullanacaksınız.

Neler öğreneceksiniz?

  • Gemini CLI'yı ayarlama
  • Gemini CLI'yı yapılandırma
  • Gemini CLI uzantısını yükleme
  • Kod inceleme ve güvenlik analizi için Gemini CLI uzantısından yararlanma
  • Gemini CLI için MCP'yi yapılandırma
  • CI/CD'de Gemini CLI'yı inceleme

Gerekenler

  • Chrome web tarayıcısı
  • Gmail hesabı
  • Faturalandırma hesabı etkinleştirilmiş bir Cloud projesi

2. 🚀 Atölye Geliştirme Kurulumuna Hazırlanma

1. adım: Cloud Console'da Etkin Proje'yi seçin

Google Cloud Console'daki proje seçici sayfasında bir Google Cloud projesi seçin veya oluşturun (konsolunuzun sol üst bölümüne bakın).

3a143645e891087.png

Bu seçeneği tıkladığınızda, örnekteki gibi tüm projelerinizin listesini görürsünüz.

59e03077d1ba2039.png

Kırmızı kutuyla belirtilen değer PROJE KİMLİĞİ'dir ve bu değer, eğitim boyunca kullanılacaktır.

Cloud projeniz için faturalandırmanın etkinleştirildiğinden emin olun. Bunu kontrol etmek için sol üst çubuğunuzdaki hamburger simgesini ☰ tıklayarak gezinme menüsünü gösterin ve Faturalandırma menüsünü bulun.

973396bb9d9c3523.png

837e03fb7edafdc4.png

"Google Cloud Platform Deneme Faturalandırma Hesabı" ifadesini Faturalandırma / Genel Bakış başlığı altında ( Cloud Console'unuzun sol üst bölümü) görüyorsanız projeniz bu eğitimde kullanılmaya hazırdır. Aksi takdirde, bu eğitimin başına dönün ve deneme faturalandırma hesabını kullanın.

7f607aa026552bf5.png

2. adım: Cloud Shell'i tanıyın

Eğitimlerin büyük bir bölümünde Cloud Shell'i kullanacaksınız. Google Cloud Console'un üst kısmındaki Cloud Shell'i Etkinleştir'i tıklayın. Yetkilendirmeniz istenirse Yetkilendir'i tıklayın.

1829c3759227c19b.png

b8fe7df5c3c2b919.png

Cloud Shell'e bağlandıktan sonra, kabuğun ( veya terminalin) hesabımızla kimliğinin doğrulanıp doğrulanmadığını kontrol etmemiz gerekir.

gcloud auth list

Aşağıdaki örnek çıktıda olduğu gibi kişisel Gmail'inizi görüyorsanız her şey yolundadır.

Credentialed Accounts

ACTIVE: *
ACCOUNT: alvinprayuda@gmail.com

To set the active account, run:
    $ gcloud config set account `ACCOUNT`

Aksi takdirde, tarayıcınızı yenilemeyi deneyin ve istendiğinde Yetkilendir'i tıkladığınızdan emin olun ( bağlantı sorunu nedeniyle kesintiye uğrayabilir).

Ardından, kabuğun doğru PROJE KİMLİĞİ ile yapılandırılıp yapılandırılmadığını da kontrol etmemiz gerekir. Terminalde $simgesinden önce ( ) içinde bir değer görüyorsanız ( aşağıdaki ekran görüntüsünde değer "your-workshop-project") bu değer, etkin kabuk oturumunuz için yapılandırılmış projeyi gösterir.

25e65d7ad1d62de0.png

Gösterilen değer zaten doğruysa sonraki komutu atlayabilirsiniz. Ancak doğru değilse veya eksikse aşağıdaki komutu çalıştırın.

gcloud config set project <YOUR_PROJECT_ID>

3. adım: Cloud Shell Editor'a alışın ve uygulama çalışma dizinini ayarlayın

Şimdi kod düzenleyicimizi bazı kodlama işlemleri yapacak şekilde ayarlayabiliriz. Bu işlem için Cloud Shell Düzenleyici'yi kullanacağız.

Open Editor (Düzenleyiciyi Aç) düğmesini tıklayın. Bu işlem, Cloud Shell Düzenleyici'yi açar. b16d56e4979ec951.png

Şimdi aşağıda gösterildiği gibi Cloud Shell Düzenleyici arayüzünü görürsünüz.

74e9e030342164b6.png

Şimdi, etkileşimde bulunacağımız demo deposunu klonlayın. Öncelikle düzenleyicinin terminalini açmamız gerekir. Menü çubuğunda Terminal -> New Terminal'ı tıklayarak veya Ctrl + Üst Karakter + C kısayolunu kullanarak yapabilirsiniz. Bu kısayol, tarayıcının alt kısmında bir terminal penceresi açar.

95e31ec63a88890d.png

Ardından terminalde şu komutu çalıştırın:

git clone https://github.com/alphinside/gemini-cli-code-analysis-demo.git code-analysis-demo

Ardından Cloud Shell Düzenleyici'nin üst bölümüne gidip File->Open Folder'ı (Dosya->Klasörü Aç) tıklayın, username (kullanıcı adı) dizininizi ve klonlanmış depo dizinini code-analysis-demo bulun,ardından Tamam düğmesini tıklayın. Bu işlem, seçilen dizini ana çalışma dizini yapar. Bu örnekte, kullanıcı adı alvinprayuda olduğundan dizin yolu aşağıda gösterilmiştir.

ee00d484ff2f8351.png

194f63ef6de51b9.png

Cloud Shell Düzenleyici çalışma dizininiz artık aşağıdaki gibi görünmelidir.

2d53c6161b553e68.png

Şimdi bir sonraki aşamaya geçebiliriz.

3. 🚀 Kurulum ve Yapılandırmalar

Gemini CLI'yı yerel sisteminize yüklemek istiyorsanız aşağıdaki adımları uygulayabilirsiniz:

  1. Sisteminizde Node sürümü 20 veya üzeri olduğundan emin olun.
  2. Aşağıdaki yöntemlerden birini kullanarak Gemini CLI'yı etkinleştirin:
  • Genel paket olarak yükleme
# Install as an executor

npm install -g @google/gemini-cli

# then run it from terminal
gemini
  • Dilerseniz her zaman en son sürümü almak için doğrudan kaynaktan çalıştırabilirsiniz.
npx https://github.com/google-gemini/gemini-cli

İlk kez çalıştırdığınızda size birkaç soru sorulur. Bu komutu bir IDE'den (ör. VSCode) çalıştırırsanız aşağıdaki soru sorulur:

7f0f7d5091df7abb.png

Ardından, kimlik doğrulamak için birkaç seçenek sunulur.

7ce5c6574f249304.png

Birkaç seçenek vardır:

  • Google ile giriş yap'ı seçerseniz tarayıcıda Google kimlik doğrulama sayfası açılır ve bunu kabul etmeniz yeterlidir.
  • Gemini API anahtarı kullanmayı tercih ederseniz AI Studio sayfasında bir anahtar oluşturmanız ve ardından çalışma dizininizde GEMINI_API_KEY değişkeni ayarlanmış .env dosyası oluşturmanız ( veya komut satırında export GEMINI_API_KEY="your-api-key" komutunu çalıştırmanız) gerekir.
  • Vertex AI'ı kullanmayı seçerseniz daha önce ayarladığınız gibi bir projeye ihtiyacınız olur. Ayrıca .env dosyası oluşturup GOOGLE_CLOUD_PROJECT ve GOOGLE_CLOUD_LOCATION'ı ayarlamanız gerekir.

Bu kimlik doğrulama yöntemlerini değiştirmek isterseniz Gemini KSA'dan /auth komutunu çalıştırabilir veya yapılandırma dosyasını düzenleyebilirsiniz. Yapılandırma dosyasını doğrudan düzenlemek istiyorsanız Linux'ta $HOME/.gemini/settings.json içinde olmalıdır . security seçeneğini görürsünüz. auth yazıp düzenleyin.

{
  "security": {
    "auth": {
      "selectedType": "vertex-ai" # or "gemini-api-key" or "oauth-personal"
    }
  }
}

72300c1f781857c8.png

4. 🚀 Temel Komut ve Yerleşik Araçlar

Şimdi de Gemini CLI hakkında daha fazla bilgi edinmek için bu arayüzü biraz inceleyelim. Kullanılabilecek bazı temel komutlar arıyorsanız /help yazarak tüm kullanılabilir komutları görüntüleyebilirsiniz.

800d1b06a5ad9f9c.png

/help

Şuna benzer bir çıkış görürsünüz: f46a75c6bb177a2b.png

Gemini CLI, bir yapay zeka temsilcisidir. Bu nedenle, kullanıcı tarafından verilen görevi çözmek için gerekli araçlara sahiptir. Yerleşik araçlarını görmek için /tools komutunu çalıştırın.

17a6d7fcf06df563.png

/tools

Aşağıdakine benzer bir çıkış gösterir:

7d22b38a387f45d0.png

Gemini CLI'ın dosyaya okuma ve yazma, web'de arama gibi çeşitli özellikleri olduğunu görebilirsiniz. Bu araçlardan bazıları, olası risk nedeniyle varsayılan olarak kullanıcı onayı gerektiriyordu.

Şimdi bunu uygulamalı olarak görelim. Bu istemleri Gemini CLI'da çalıştırmayı deneyin.

15e2d863a4eb8df4.png

Find top 10 OWASP security issue and write it down to owasp.md

GoogleSearch aracının çağrıldığını ve daha sonra WriteFile aracını kullanarak sonucu yazdığını görürsünüz. IDE kullanıyorsanız önerilerin kabul edilip edilmeyeceğini belirten bir fark ve görüntüleme seçeneği gösterilir. Burada, Gemini CLI'nın dosyayı yazmak için sizden izin istediğini görebilirsiniz.

8163f43b05ca59a3.png

5. 🚀 Uzantılar

Bir yapay zeka aracısı ile belirli bir görevin çıktısını iyileştirmek için uygun bir istem oluşturma, uygun araç entegrasyonu ile uygun bir bağlam mühendisliği yönetme gibi zorlu konuları ele almamız gerekir.

Gemini CLI Uzantıları, harici araçlara bağlanabilen, önceden paketlenmiş ve kolayca yüklenebilen istemler ve entegrasyonlardır. Her uzantı, araçların etkili bir şekilde nasıl kullanılacağıyla ilgili yerleşik bir "playbook" içerir ve şu bileşenlerden oluşabilir:

  • Özel eğik çizgi komutları
  • MCP yapılandırmaları
  • Bağlam dosyaları

6da12f33463ac755.png

Güvenlik uzantılarını yükleme

Örneğin, bu eğitimde code-review ve security uzantılarının nasıl yüklenebileceğini inceleyeceğiz.

Terminalden security uzantılarını yüklemek için aşağıdaki komutu çalıştırın.

gemini extensions install https://github.com/gemini-cli-extensions/security

Aşağıdaki sorular gösterilir. Kabul etmek için Enter tuşuna basın.

Installing extension "gemini-cli-security".
**Extensions may introduce unexpected behavior. Ensure you have investigated the extension source and trust the author.**
This extension will run the following MCP servers:
  * securityServer (local): node /home/alvinprayuda/.gemini/extensions/gemini-cli-security/mcp-server/dist/security.js
This extension will append info to your gemini.md context using GEMINI.md
Do you want to continue? [Y/n]:
Extension "gemini-cli-security" installed successfully and enabled.

Kod İnceleme Uzantılarını Yükleme

Ardından code-review uzantısını yüklemek için aşağıdaki komutu çalıştırın.

gemini extensions install https://github.com/gemini-cli-extensions/code-review

İşlem tamamlandıktan sonra Gemini CLI'yı tekrar çalıştırın.

gemini

komutunu çalıştırdığınızda bu iki uzantının zaten yüklü olduğunu görürsünüz./extensions

88a86a0dc42fc510.png

/extensions

Şimdi de daha önce klonladığınız örnek depoda pratik bir uygulama yapalım.

6. 🚀 Etkileşimli Mod - Kod Güvenliği Analizi Uzantısı Uygulaması

Güvenlik uzantısı, açık kaynaklı bir Gemini CLI uzantısıdır ve depodaki güvenliği artırmak için geliştirilmiştir. Uzantı, Gemini CLI'ye çeşitli güvenlik risklerini ve güvenlik açıklarını belirlemek için kod değişikliklerini analiz eden yeni bir komut ekler.

Şimdi önce demo depomuzu hazırlayalım. Güvenlik riski içeren değişikliklerin uygulandığı dala geçmek için aşağıdaki komutu çalıştırın.

git checkout refactor/analysis-demo

Ardından terminalde Gemini CLI'yı çalıştırın.

gemini

Ardından uzantıları çalıştıralım.

e3fcf630238f9b2e.png

/security:analyze

Bu işlem uzun sürecek bir işlemi başlatır ve işlem sırasında, aşağıda gösterildiği gibi mkdir gibi belirli işlemleri çalıştırmak için izninizi isteyen birkaç kesinti alırsınız.

10d6ad2ef91b5acf.png

Bu, kullanıcıların Gemini CLI tarafından neyin yürütüleceğinin farkında olmasını sağlayan bir koruma mekanizmasıdır. Eğitimin geri kalanında her zaman izin verebilirsiniz ( 2. seçenek).

Bu uzantı, uzun süren bir işlemi başlatır. .gemini_security dizininde bir planlama dosyası oluşturduğunu ve hangi işlemin tamamlandığını veya tamamlanmadığını kontrol listesinde görebilirsiniz. Aşağıdaki örnekte gösterildiği gibi:

543035cb65d27804.png

Bu uzantıların görevlerini tamamlaması biraz zaman alacaktır. Bu süre zarfında, GitHub deposunda bu uzantıların kaynağını kontrol edebiliriz. Bu URL, tüm bu güvenlik tarama işlemlerini çalıştırmak için kullanılan istemi gösterir.

73f4966870bc9ddf.png

Orada da görebileceğiniz gibi, bunu yapmak için Gemini KSA olarak istemi tarayarak iki aşamalı kontrol gerçekleştiriyoruz: Keşif Aşaması ve daha ayrıntılı olan İnceleme Aşaması.

Gemini CLI'da aşağıdaki istemle karşılaşırsanız döngü algılamayı devre dışı bırakmak için 2. seçeneği belirleyebilirsiniz.

a0af5e15627afa83.png

Ardından Gemini CLI'dan devam etmesini isteyin.

611a7ed0fb6fc44b.png

continue

Bu, sonsuz ve verimsiz araç çağırma döngülerini önlemek için kullanılan bir mekanizmadır ve zaman içinde geliştirilmeye devam edecektir.

İşlem tamamlandıktan sonra rapor, etkileşimli terminalde gösterilir. Bunu kolaylaştırmak için Gemini CLI'ya raporu security-analysis.md içine yazmasını söyleyelim.

b4cbad3aaeaa8dce.png

write the result to security-analysis.md file

Artık dosyaya yazılan sonucu inceleyebilirsiniz.

7. 🚀 Non-Interactive Mode - Code Review Extension Application

code-review uzantısı, çeşitli kod kalitesi sorunlarını belirlemek için kod değişikliklerini analiz eden Gemini CLI'ye yeni bir komut ekler.

Bu uzantı, Gemini CLI'nin etkileşimli olmayan modunda yürütülebilir. Yani tüm süreç, Gemini CLI kabuğuna girilmesine gerek kalmadan yürütülebilir. Gemini KSA'yı etkileşimli olmayan modda çalıştırmak için aşağıdaki komut kalıbını kullanabilirsiniz.

gemini "put your command here"

Ancak etkileşimli olmayan modda çalışmanın, kullanıcı izni gerektiren tüm araç işlemlerini devre dışı bırakacağını unutmamak önemlidir. Bu nedenle, tüm işlemleri otomatik olarak onaylamak için --yolo işaretini eklememiz gerekir. Bu da etkileşimli olmayan modda tüm araçların etkinleştirilmesi anlamına gelir.

Aşağıdaki komutla code-review uzantısını çalıştıralım.

gemini "/code-review" --yolo -e code-review > code-review.md

Bu komut, Gemini CLI çıkışının sonucunu code-review.md dosyasına yazar. Buradaki -e işaretine dikkat edin. Bu işaret, oturum sırasında hangi uzantının etkinleştirileceğini kontrol eder. Burada yalnızca code-review uzantısını etkinleştirip diğerlerini devre dışı bırakıyoruz.

Bu işlem biraz zaman alır. Tamamlandıktan sonra, aşağıda gösterildiği gibi Markdown dosyasına yazılan benzer bir sonuç görebilirsiniz.

Here are the results of the code review.

While the recent changes to rename `get_products` and `get_product` to `GetProducts` and `GetProduct` are minor, the codebase has some inconsistencies in its naming conventions. For instance, other functions like `create_product` use `snake_case`, while the newly renamed functions use `PascalCase`. For better code quality and readability, I recommend using a consistent naming convention throughout the project.

More importantly, I have identified several security vulnerabilities in the `main.py` file. Here is a summary of the findings:

### 1. SQL Injection
*   **Severity**: High
*   **Location**: 
    *   `main.py:99` in `get_products_by_category`
    *   `main.py:146` in `search_products`
    *   `main.py:372` in `get_user_transactions`
    *   `main.py:438` in `adjust_inventory_by_query`
*   **Description**: The endpoints directly use f-strings to construct SQL queries, making them vulnerable to SQL injection attacks. An attacker could manipulate the input to execute arbitrary SQL commands, potentially leading to data breaches or unauthorized modifications.
*   **Recommendation**: Use parameterized queries or an ORM to handle database interactions. This will ensure that user input is properly sanitized and prevent SQL injection attacks.

### 2. Server-Side Request Forgery (SSRF)
*   **Severity**: High
*   **Location**: `main.py:265` in `fetch_url`
*   **Description**: The `fetch_url` endpoint allows users to specify an arbitrary URL, which the server then requests. This can be exploited to make requests to internal services or local files, leading to information disclosure or other security breaches.
*   **Recommendation**: Implement a whitelist of allowed domains or protocols to restrict the URLs that can be requested. Additionally, you can disable redirects and use a timeout to limit the impact of an attack.

### 3. Information Exposure
*   **Severity**: Medium
*   **Location**: `main.py:423` in `get_environment_variables`
*   **Description**: The `get_environment_variables` endpoint exposes all environment variables to the user. This can include sensitive information such as API keys, database credentials, and other secrets.
*   **Recommendation**: Remove this endpoint or restrict access to it to authorized users. If you need to expose some environment variables, do so selectively and avoid exposing sensitive information.

8. 🚀 Model Context Protocol Support

Şimdi, uzantı açıklamalarında daha önce incelediğimiz gibi Gemini CLI, Model Context Protocol aracılığıyla araçlar ve kaynaklar sağlayan uygulamalar olan MCP sunucularına bağlanabilir. Bu bağlantı, Gemini CLI'nin yerel ortamınız ve API'ler gibi harici hizmetler için köprü olarak MCP sunucularını kullanarak harici sistemler ve veri kaynaklarıyla etkileşim kurmasına olanak tanır.

5f1cdd4be3e7b42a.png

Kendi MCP sunucu kurulumunuzu yapmak istiyorsanız .gemini/settings.json dosyanızı değiştirmeniz ve aşağıdaki yapılandırmaları eklemeniz gerekir :

{
    ...
    # Previous settings above if any
    "mcpServers": {
       "server_name": {
           # MCP server configurations here
       }
    }
}

Bu eğitimde, önceki rapor verilerini GitHub'a aktarmak için GitHub hesabımızla bağlantıyı yapılandıralım.

Github MCP sunucusunu yapılandırma

Öncelikle Gemini CLI proje yapılandırma dosyamızı oluşturalım. Aşağıdaki komutu çalıştırın

mkdir -p .gemini && touch .gemini/settings.json

Ardından .gemini/settings.json dosyasını açın ve aşağıdaki yapılandırmayla doldurun.

{
  "mcpServers": {
       "github": {
            "httpUrl": "https://api.githubcopilot.com/mcp/",
            "headers": {
                "Authorization": "your-personal-access-token"
            },
            "timeout": 5000
       }
  }
}

Şimdi, kendi GitHub kişisel erişim jetonunuzu buraya girmeniz gerekecek. Bu nedenle, kendi GitHub hesabınızın olduğundan emin olun.

GitHub hesabınıza giriş yapın ve Ayarlar'a gidin.

dc57f047ca9a2b83.png

Ardından, Geliştirici ayarları'nı bulup tıklayın.

59d9b700c41ca1b6.png

Ardından Kişisel erişim jetonları'nı seçip Jetonlar (klasik)'i belirleyin.

e96fccd80872e480.png

30ac727da307602b.png

Kişisel erişim jetonunuza burada ad verin ve repo kapsamlarını işaretleyin.

ad167223fa231e3c.png

Ardından aşağı kaydırıp Jeton oluştur düğmesini tıklayın.

Yeni jeton oluştur düğmesini tıklayın ve Yeni jeton oluştur (klasik) seçeneğini belirleyin. Ardından, oluşturulan jetonu kopyalayın ve .gemini/settings.json dosyasına yazın.

efd82711868093c0.png

Bu nedenle, .gemini/settings.json dosyanız aşağıdaki örneğe benzemelidir.

{
  "mcpServers": {
       "github": {
            "httpUrl": "https://api.githubcopilot.com/mcp/",
            "headers": {
                "Authorization": "ghp-xxxx"
            },
            "timeout": 5000
       }
  }
}

Şimdi bağlantıyı doğrulayalım. Bu komutu çalıştırarak Gemini CLI'ya girin.

gemini

Ardından, /mcp komutunu çalıştırın. Github MCP'nin zaten doğru şekilde yapılandırıldığını görmeniz gerekir.

a97c9a98f07dc87c.png

/mcp

Ardından, bu komutu göndererek bu MCP bağlantısını test edelim.

59bfd79aba7cc386.png

Aggregate the findings from @code-review.md and @security-analysis.md into a single report and ensure no duplicates issues reported. Post this report as a comment on the relevant pull request for the current git branch on GitHub and display the pull request URL for manual review

Buradaki @code-review.md ve @security-analysis.md gösterimine dikkat edin. Bu, Gemini CLI'ye iletilecek dosyalara referans verme şeklimizdir. Bu komut, her iki dosyanın içeriğini okur ve Github MCP bağlantısını kullanarak bu şube ile ilgili çekme isteğine bir yorum gönderir. Ardından, çekme isteği URL'sinde kontrol ederek doğrulayabilirsiniz.

864b859b56cfe9e7.png

9. 💡CI/CD iş akışında Gemini CLI

GitHub kullanıcısıysanız run-gemini-cliGitHub Action'ı kullanarak Gemini KSA'yı CI/CD ardışık düzeninize kolayca yerleştirebilirsiniz. Hem kritik rutin kodlama görevleri için bağımsız bir aracı hem de işi hızlıca devredebileceğiniz, isteğe bağlı bir iş arkadaşı olarak çalışır.

Bu özelliği kullanarak doğrudan GitHub depolarında Gemini ile etkileşimli bir şekilde çekme isteği incelemeleri yapabilir, sorunları önceliklendirebilir, kod analizi ve değişikliği yapabilir ve daha fazlasını gerçekleştirebilirsiniz.

Bu entegrasyonun örneğini bu çekme isteğinde inceleyebilirsiniz. Burada, koşucu içinde Gemini KSA Güvenlik uzantısını kullanıyoruz ve çekme isteği oluşturulduğunda incelemeleri veriyoruz.

ad2a8e8d0a15e3f5.png

3cb40f104ce6a594.png

8edb7277fa6324b.png

ef48414c02a16dfa.png

10. 💡Diğer Gemini CLI Uzantıları'nı Keşfedin

8a7939ee0328e6e2.png

Ayrıca https://geminicli.com/extensions adresinden daha fazla uzantıyı keşfedebilirsiniz . Daha ilginç araçlar için göz atın.

11. 🧹 Temizleme

Bu codelab'de kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini istemiyorsanız şu adımları uygulayın:

  1. Google Cloud Console'da Kaynakları yönetin sayfasına gidin.
  2. Proje listesinde silmek istediğiniz projeyi seçin ve Sil'i tıklayın.
  3. İletişim kutusunda proje kimliğini yazın ve projeyi silmek için Kapat'ı tıklayın.